insertのときには不要だった準備が必要だった。
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 2018-06-27
- Qt 5.7.1
前回
- 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. モデルからレコードの追加と削除
model.insertRecord(0, rec); // 0行目に追加 model.removeRow(0); // 0行目を削除 model.removeRows(0, model.rowCount()); // 0行目からcount件を削除
本日の主役が以下の2つ。レコードを削除する。
model.removeRow(0);
model.removeRows(0, model.rowCount());
条件は指定できないみたい。たとえば、ある列の値がある値のレコードを削除するとか。delete from SomeTable where Id=0
みたいにwhile
句で条件指定して削除したい。
たぶんremoveRow(int row)
という引数と、QtがGUIライブラリであることから考えるに、「GUIで選択した行を削除する」という想定なのだろう。表計算ソフトみたいなGUIがあって、矢印キーで1行ずつ選択して削除したり、連続した複数行を選択して削除する、というユースケースを想定したメソッドなのだろう。
実際はそれだけだと使いづらすぎる。条件を指定できないのか? SQL文でDELETE文を発行すればできるのだろうが、他に方法はないのか?
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はできるのだろうか。