【问题标题】:Qt - sync SQLite data base on application closeQt - 在应用程序关闭时同步 SQLite 数据库
【发布时间】:2016-09-21 19:15:15
【问题描述】:

通过以下代码在应用程序中打开数据库:

db = QSqlDatabase::addDatabase("QSQLITE");
bool dbExists = QFile::exists("base.db");
db.setDatabaseName("base.db"); // ":memory:"
if (!db.open()) {
    db.close();
    QMessageBox::critical(0, tr("Cannot open database"),
                          tr("Unable to establish a database connection.\n"
                             "This example needs SQLite support. Please read "
                             "the Qt SQL driver documentation for information how "
                             "to build it."), QMessageBox::Cancel);
    return;
}
if (!dbExists)
    createDB();

我已经通过 QDataWidgetMapper 将一些表映射到小部件。在应用程序运行期间一切正常。更改生效。但是在使用现有 base.db 重新启动应用程序后,所有更改都会丢失。应用程序启动速度更快,因此它会打开此文件但数据库未更改。

我已尝试关闭应用程序

db.close();
this->close();

没有运气。在 db.open 之后,即使是同步查询也没有帮助:

QSqlQuery query(db);
query.exec("PRAGMA synchronous = ON;");

在将更改同步到 base.db 时我错过了什么?

更新。您可以尝试构建 sqlwidgetmapper 标准示例并将 :memory: 更改为“base.db”文件。它也不会将更改的数据保存到文件中。

【问题讨论】:

  • 请添加显示您如何设置 QWidgetDataMapper 及其使用的模型的代码。我对这个问题做了一个疯狂的猜测,但即使我猜对了并且解决了问题,如果其他人也请添加代码以获取利益。

标签: qt sqlite qtsql


【解决方案1】:

问题可能是manual submit policy

要么将其切换为自动,要么在适当的时间手动调用QDataWidgetMapper::submit()(在新值从小部件中丢失之前)。

【讨论】:

  • 谢谢你,海德。 OnFieldChange 工作得很好。 QSqlTableModel 中没有 OnAutoSubmit。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2018-01-17
  • 1970-01-01
  • 2012-09-12
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多