1

Jay のおかげで、問題は QML にあるのではなく、データベースだけにあるようです。

したがって、最小限の誤ったコードは次のようになります。

QFile::remove("my.db.sqlite");

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db.sqlite");
db.open();

QSqlQuery drop("drop table List;");
QSqlQuery create("create table List (sample_text char(200));");
QSqlQuery insert("insert into List values (\"some message!\");");

drop.exec();
create.exec();
insert.exec();

db.close();

my.db.sqlite を検査すると、次のようになります。

sqlite> select * from list;
some message!
some message!

ありがとう!

------ 古い質問 -------

私は QtSql と QML の両方を学習中なので、エラーの余地があります。私の問題のほとんどは、私の質問のタイトルにあります。私はそれを再現するために短い自己完結型のコードを作成しようとしました:

C++ コード:

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
    // uncomment after first launch, deleted test to make code short
// QFile::remove("my.db.sqlite"); 

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("my.db.sqlite");
db.open();

QSqlQuery create("create table List (sample_text char(200))");
QSqlQuery create2("insert into List values (\"message !\")");
create.exec();
create2.exec();

QSqlQueryModel *someSqlModel = new QSqlQueryModel();
someSqlModel->setQuery("SELECT * FROM List");

QQmlContext *context = viewer.rootContext();
context->setContextProperty("datamodel", someSqlModel);

viewer.setMainQmlFile(QStringLiteral("qml/test/main.qml"));
viewer.showExpanded();

return app.exec();
}

QML コード :

Rectangle {
ListView {
    width: 200; height: 200
    model: datamodel
    delegate: Row {
        Rectangle {
            width: 100; height: 40
            Text {
                anchors.fill: parent
                text: display
            }
        }
    }
}
}

「メッセージ!」が届くはずです。私のリストの出力として、しかし私は得る:

メッセージ !

メッセージ !

助けはありますか?ありがとう!

4

2 に答える 2

1

さて、ついにエラーを見つけました。

このバグレポートによると:

https://bugreports.qt-project.org/browse/QTBUG-30205

exec()のコンストラクターにクエリを配置する場合は、呼び出してはなりませんQSqlQuery

于 2013-08-04T16:09:08.603 に答える
0

あなたの sqllite データベースには複数のレコードが含まれていると思います。

このアプリを複数回実行すると、テーブルの作成が失敗し、別の行が挿入され、複数の行が表示されると思います。

sqlite コマンド ライン アプリケーションを使用して、データベースの内容を確認できます。

于 2013-08-02T16:35:27.820 に答える