首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt表模型示例

问Qt表模型示例
EN

Stack Overflow用户
提问于 2016-06-20 23:03:53
回答 2查看 576关注 0票数 0

我在看Qt示例“表模型示例”

在该示例中,connection.h中的createConnection()方法包含以下代码:

代码语言:javascript
复制
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(":memory:");
    if (!db.open()) {...

我在代码中复制了这个示例。我不明白两件事。

  1. 局部变量db在createConnection()函数的末尾被销毁(参见RAII)。由于我的数据库不需要初始化,而且我也不使用"db“变量,所以我不明白为什么需要这段代码。但是,如果我删除它,我的程序就无法从我现有的数据库中读取。我希望数据库的销毁会关闭数据库并使其不可用。但是,既然我没有接触db变量,为什么需要先创建它然后销毁它,然后才能访问数据库?由于我在任何地方都不使用db变量,并且在调用代码之前就销毁了它,所以我完全不明白为什么需要调用createConnection()函数。另一方面,我不知道如何打开数据库并使变量销毁具有异常安全的RAII代码。
  2. 我从不让db.open()失败。如果我没有数据库,它会创建数据库,然后打开一个空白的数据库。如果我有数据库,它就会打开它。我有一个数据库,如果由于任何原因它无法打开,我不希望它被创建,我想要一个错误,因为有严重的错误。打开一个空白的数据库只会给我带来麻烦。我该怎么处理这个案子?

我是Qt新手,但在C++方面非常有经验。这段代码对我来说没什么意义。我希望db变量的生存期是开放数据库的生存期。正如示例中所编码的那样,我无法理解这段代码如何没有出现资源泄漏。据我所知,初始化db会打开某种全局资源,即使db变量被破坏导致泄漏,也会使它保持打开状态。

这很让人困惑。

谢谢。

H Os Tile

EN

回答 2

Stack Overflow用户

发布于 2016-06-21 05:49:59

这只是一个很小的例子。

  1. QSqlDatabase::addDatabase("QSQLITE");将创建默认连接,该连接将被任何后续查询使用,而不是显式命名另一个连接。在作用域结束时,连接不会被销毁。在本例中,createConnection()将用于初始化inMemory数据库。稍后可以使用QSqlDatabase::database()检索连接。在标准应用程序中,可能会将QSqlDatabase db保留为类成员。
  2. 使用inMemory db只创建一个空db,就像它用于基于SQLite文件的db一样。如果要检查现有文件(db),请使用QFile::exists(QString path)。

如果要打开许多数据库( QSqlDatabase::addDatabase("QSQLITE","anotherConnectionName");上有不同的连接名称,则会有泄漏)。否则,您只需要覆盖默认的数据库连接。QApplication本身将保留这些连接。它们可以使用QSqlDatabase::removeDatabase()显式删除;

票数 0
EN

Stack Overflow用户

发布于 2016-06-21 22:06:08

QSqlDatabase是一个相当奇怪的类。阅读它的文件。连接保持不变,QSqlDatabase是它的句柄。连接被命名,addDatabase用给定的名称返回连接,如果它不存在,还可以选择创建它。可以有任意数量的QSqlDatabase对象表示一个连接。

由于内存中的sqlite数据库是特定于您的进程的,所以当您要求创建一个数据库时,不创建它是没有什么意义的。要想提前创建它,唯一的方法是直接从您的过程中使用sqlite。这些数据库不会持久存在。这里的行为是相当明智的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37933155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档