やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

QSqlTableModelでレコード更新してみた

 model.setRecord(0, QSqlRecord)で0行目のレコードを更新できる。model.record(0);で0行目のレコードを取得できる。

成果物

github.com

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 2018-06-27
  • Qt 5.7.1

前回

コード抜粋

  1. DB接続
  2. テーブル作成
  3. モデル作成
  4. モデルからレコードの更新
  5. 編集の確定
  6. select文でレコード確認

1. DB接続

QSqlDatabase db = QSqlDatabase::database("Memo");

2. テーブル作成

QSqlQuery query(db);
query.exec(tr("create table Memo(id INTEGER PRIMARY KEY AUTOINCREMENT, Memo TEXT, Created TEXT)"));
query.exec(tr("insert into Memo(Memo,Created) values('メモ内容だよ', '1999-12-31 23:59:59')"));

3. モデル作成

QSqlTableModel model(nullptr, db);
model.setTable("Memo");
model.setEditStrategy(QSqlTableModel::EditStrategy::OnManualSubmit); // これがないとmodel.removeRow, removeRowsが反映されない
model.select(); // これがないとquery.exec()で発行したinsert文のデータが残る

 Insertのときは不要だったが、Deleteするときは以下のメソッドが必要。

  • model.setEditStrategy(QSqlTableModel::EditStrategy::OnManualSubmit);
  • model.select();

4. モデルからレコードの更新

QSqlRecord updateRecord = model.record(0); // 0行目のレコードを取得する
updateRecord.setValue("Memo", QVariant("updateRecordしたよ"));
model.setRecord(0, updateRecord); // 0行目のレコードを更新する
  • model.record(0);: 0行目のレコードを取得する
  • model.setRecord(0, updateRecord);: 0行目のレコードを更新する

 レコード値を変更しなかった部分はそのまま。

 これもremoveRowと同じく行位置を対象とする。できればWhere句で指定したレコードを対象にしたいが、その方法がわからない。

5. 編集の確定

if( model.submitAll() ) {
    model.database().commit();
    qDebug() << "commit()";
} else {
    model.database().rollback();
    qDebug() << "rollback()";
}

6. select文でレコード確認

query.exec(tr("select * from Memo"));
while (query.next()) {
    qDebug() << query.value(0) << "|" << query.value(1) << "|" << query.value(2);
}

所感

 QSqlTableModelにてInsert、Delete、Update、Selectはできた。CreateTableはできるのだろうか。行数指定でなくWhere句指定したレコードを対象にできるだろうか。