2016-09-21 3 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. Все работает нормально во время запуска приложения. Изменения вступают в силу. Но все chages теряются после перезапуска приложения с существующим base.db. Приложение запускается гораздо быстрее, поэтому он открывает этот файл, но с неизменной базой данных.

Я попытался закрыть приложение,

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

Там не повезло. Даже синхронизации запроса не помогло после db.open:

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

Что я пропустил синхронизировать изменения base.db?

ОБНОВЛЕНИЕ. Вы можете попробовать построить sqlwidgetmapper стандартный пример и изменить: memory: to "base.db" file. Он также не сохраняет измененные данные в файл.

+0

Пожалуйста, добавьте код, показывающий, как вы настроили QWidgetDataMapper и модель, которую он использует. Я сделал глупость в этой проблеме, но даже если бы я догадался, и это решает проблему, добавьте код для выгоды, если другие. – hyde

ответ

2

Проблема, возможно, manual submit policy.

Либо переключитесь на автоматическое, либо вручную вызовите QDataWidgetMapper::submit() в соответствующее время (до того, как новое значение будет потеряно от виджета).

+0

Спасибо, hyde. OnFieldChange работает просто fune. В QSqlTableModel нет OnAutoSubmit. –

Смежные вопросы