ソートできた!
成果物
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 2018-06-27
- Qt 5.7.1
前回
- http://ytyaru.hatenablog.com/entry/2020/01/02/000000
- http://ytyaru.hatenablog.com/entry/2020/01/01/000000
- 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. モデルのレコードを並び替える
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) |