1

Books Qt の例で作業していますが、SQLite の代わりに PostgreSQL を使用しているため、メイン テーブルと関連テーブルは次のコードで作成されました。

QSqlQuery q;
if (!q.exec(QLatin1String("create table orders(id serial primary key, name varchar, supplier integer, product integer, year integer, rating integer)")))
    return q.lastError();
if (!q.exec(QLatin1String("create table suppliers(id serial primary key, name varchar, birthdate date)")))
    return q.lastError();
if (!q.exec(QLatin1String("create table products(id serial primary key, name varchar)")))
    return q.lastError();

ここで、データベースに新しい行を追加したいと思います。これまでのところ、次のコードがあります。

QSqlRecord record;

QSqlField f0("id", QVariant::Int);
QSqlField f1("name", QVariant::String);
QSqlField f2("supplier", QVariant::Int);
QSqlField f3("product", QVariant::Int);
QSqlField f4("year", QVariant::Int);
QSqlField f5("rating", QVariant::Int);

// id is serial and I'd like not to set manually the value
f0.setValue(100);
f1.setValue(QVariant("Test1"));
f2.setValue(QVariant(3));
f3.setValue(QVariant(3));
f4.setValue(QVariant(2001));
f5.setValue(QVariant(5));

record.append(f0);
record.append(f1);
record.append(f2);
record.append(f3);
record.append(f4);
record.append(f5);

model->insertRecord(-1, record)

そして、ここに問題があります。ご覧のとおり、idが主キーで、そのタイプはserialです。値を設定しない場合 (つまり行を削除する場合record.append(f0);)、テーブルは PostgreSQL で適切に更新されますが、Qt は にある空白行を表示しTableViewますMainWindow

QSqlField::setAutoValueand で試しましQSqlField::setGeneratedたが、動作は同じです。QAbstractItemModel::setData別のオプションになりますが、解決策でもありません。

レコードを挿入してからid、データベースに保存されている最初のフィールドを更新することができましたが、この問題がバグなのか、API が正しいのか、問題は私が使用している方法なのか疑問に思っています。

4

0 に答える 0