2016-09-21 18 views
1

データ・ベースは、次のコードによって、アプリケーションにoppenedさ:のQt - 近いアプリケーションで同期SQLiteのデータベースは

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でアプリケーションを再起動すると、すべてのchagesが失われます。アプリケーションははるかに高速に起動するため、このファイルを開きますが、データベースは変更されません。

私は運がありません

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

することにより、アプリケーションを閉じるようにしようとしました。同期クエリでもdb.openの後には役に立ちませんでした:

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

私はbase.dbへの変更を同期するのに何が欠けていますか?

UPDATE。sqlwidgetmapperの標準サンプルをビルドして、memory: "base.db"ファイルに変更できます。変更されたデータもファイルに保存されません。

+0

QWidgetDataMapperの設定方法と使用するモデルを追加してください。私はこの問題で野生の推測をしましたが、たとえ私が正しいと推測して問題を解決したとしても、他の人にとっては利益のためにコードを追加してください。 – hyde

答えて

2

問題はおそらくmanual submit policyです。

自動に切り替えるか、またはQDataWidgetMapper::submit()を適切な時間(ウィジェットから新しい値が失われる前)に手動で呼び出します。

+0

ありがとう、ハイデ。 OnFieldChangeはちょうどfuneで動作します。 QSqlTableModelにはOnAutoSubmitはありません。 –

関連する問題