やってみる

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

QSqlTableModelでレコード削除してみた

 insertのときには不要だった準備が必要だった。

成果物

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. モデルからレコードの追加と削除

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はできるのだろうか。