问题描述:
使用 · QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1StringView(defaultConnection))· 静态函数链接 sqlite 时,明明使用 `bool QSqlDatabase::isOpen() const` 返回 true ,却在目录当中找不到 数据库 文件!
解决方案
使用 · QSqlDatabase addDatabase(const QString &type, const QString &connectionName = QLatin1StringView(defaultConnection))· 的第二参数
描述
首先 QSqlDatabase addDatabase 可以打开一个数据库,而这个打开是存在辨别性质的。而所谓辨别性质是指 “ 存在某一对象管理已经存在的标识 ”。说到这,很明显突出了 “如何管理” 的问题。在了解这个问题之前,我们先了解一下 QSqlDatabase addDatabase 的参数
1 const QString &type : 数据库类型
2 const QString &connectionName : 链接名称
第一个参数很容易懂,因为链接 “sqlite” 时,它必须是 R"(QSQLITE)" 字符串,二第二个参数我们都很少接触,因为 " 网络的教程几乎不对第二个参数进行配置。 "但也因此诞生了一个错误。因为这参数正是 ‘管理标识’。
在函数描述当中,这个存在默认值,如:R"(qt_sql_default_connection)" , 而且重复使用这个调用时,那么就会发生异常。告诉你,这个链接已经被链接。而所谓的 “已经” 直接说明了问题。这中情况下,有人会告诉你:使用 "QSqlDatabase QSqlDatabase::database(const QString &connectionName = QLatin1StringView(defaultConnection), bool open = true)" , 到了这个时候,新的问题将会诞生。 QSqlDatabase::database 是什么作用?这里,我会告诉你,它就是使用 “被管理的辨别标识来获取一个链接”。也就是说,这个过程与我们的课题无关,他并不能解决“找不到数据库文件的问题。”,反而诞生了“这个函数是什么作用的问题”。所以,我们可以忽略这个函数,反而重新回到第一个调用 addDatabase 上,但有趣的是,他为我们提供了思路,比如说他的参数 “connectionName”,噢噢~可以发现 ,这个在 addDatabase 第二个参数也有提及。那么我们可以利用它,比如说“在不改变这个值情况下重复链接不同的库”,幸运的你会发现,第一次调用的数据库文件在第二次调用的时候出现了!
结果很棒。
结论
在链接 sqlite 时候,应该使用 addDatabase 的第二个参数
QString dbName = QDateTime::currentDateTime( ).toString( u8"1 - yyyy_MM_dd hh-mm-ss" ).append( ".db" );
QSqlDatabase::addDatabase( "QSQLITE", dbName )
database->setDatabaseName( dbName );
即便上面的代码看上去略有重复,但并不阻止他们成为一个“唯一的链接”
问题的根源在于第二个链接的数据库并不准确,即便它被 "setDatabaseName" 设置了路径!但他仍然是失败的,因为它是上一个链接,它是 open 的!如果需要重复使用默认的链接名称,那么你需要关闭一次,然后重复打开。但在链接多个数据库的场景当中,这是一个失误!所以第二个参数是不可忽略的,而且它会导致隐形错误。而这样的错误可以归纳为“第二个链接没有被正确链接上,导致目前还在操作上一个数据库。而第二个数据库文件根本就从来没利用过。”