テーブルがまだ存在しない場合にのみ、sqlite データベースを初期化しようとしています。そうでない場合は、作成する必要があります。これで、チェックは常にクリーンなデータベースで成功します (もちろん、テーブルはまだ存在しません) が、-block 内にテーブルを作成しようとするとif
、sqlite は実際に存在すると不平を言います。そのコードの実行後にテーブルが存在することを確認できますが、qFatal
呼び出しからまだそのエラー メッセージが表示されます。
#include <QApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QStringList>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if(!db.open())
qDebug() << "Couldn't open database file!";
else
qDebug() << "Opened database :memory:";
qDebug() << "Existing tables:";
QStringList::const_iterator it;
for(it = db.tables().begin(); it != db.tables().end(); it++)
qDebug() << it->toLocal8Bit().constData();
qDebug() << "End";
if(!db.tables().contains(QString("testtable")))
{
// The files table doesn't exist
qDebug() << "Initializing DB";
QString queryText = "CREATE TABLE testtable (id varchar(32) NOT NULL)";
QSqlQuery query(queryText, db);
if(!query.exec())
qFatal("Couldn't initialize database: %s: %s", qPrintable(query.lastError().driverText()), qPrintable(query.lastError().databaseText()));
}
return a.exec();
}
参照出力:
Opened database :memory:
Existing tables:
End
Initializing DB
Couldn't initialize database: Unable to fetch row: table testtable already exists
SQLクエリで使用して問題を回避しIF NOT EXISTS
ましたが、実際には問題は解決しません。(OS X および Ubuntu 12.04 の Qt 4.8)