QSqlTableModelでレコード更新してみた
model.setRecord(0, QSqlRecord)
で0行目のレコードを更新できる。model.record(0);
で0行目のレコードを取得できる。
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 2018-06-27
- Qt 5.7.1
前回
- http://ytyaru.hatenablog.com/entry/2019/12/31/000000
- http://ytyaru.hatenablog.com/entry/2019/12/30/000000
- http://ytyaru.hatenablog.com/entry/2019/12/29/000000
- http://ytyaru.hatenablog.com/entry/2019/12/28/000000
- http://ytyaru.hatenablog.com/entry/2019/12/27/000000
- http://ytyaru.hatenablog.com/entry/2019/12/26/000000
- http://ytyaru.hatenablog.com/entry/2019/12/24/000000
- http://ytyaru.hatenablog.com/entry/2019/12/23/000000
- http://ytyaru.hatenablog.com/entry/2019/12/22/000000
- http://ytyaru.hatenablog.com/entry/2019/12/21/000000
コード抜粋
- DB接続
- テーブル作成
- モデル作成
- モデルからレコードの更新
- 編集の確定
- 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句指定したレコードを対象にできるだろうか。