やってみる

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

QSqlTableModelでレコードを並び替えた

 ソートできた!

成果物

github.com

f:id:ytyaru:20181129223018p:plain

対象環境

  • 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.sort()で並び替える
model.setFilter("");
model.sort(model.record().indexOf("Created"), Qt::SortOrder::DescendingOrder);

 並び替えたレコードを参照してデバッグ出力する。

for (int r = 0; r < model.rowCount(); r++) {
    QString text;
    for (int c = 0; c < model.columnCount(); c++) {
        text += model.record(r).value(c).toString() + tr("|");
    }
    qDebug() << text;
}

 取得された列はQVariant型。これを文字列型に変換した。本番ではint, datetimeなどそれぞれの型に変えるべき。そのコードをどうすれば共通化できるのか気になっている。

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, update, delete, where(filter(絞込)), order by(sort(並び替え))はできた。あとはcreate tableができるかどうか。

SQL構文 QSqlTableModel対応メソッド
insert文 insertRecord(QSqlRecord)
update文 setRecord(QSqlRecord)
delete文 removeRow(int row), removeRows(int row, int count)
where句 setFilter(QString) ※列名 = '値'
Order By句 sort(int, flag)