一部のデータを格納するためのデータベース アクセス アプリを作成しており、モデル/ビュー アーキテクチャについていくつか質問したいと思います。
(使用: Qt 4.7.4、独自のビルド; PostgreSQL 9.0; ターゲット: WinXP、Win7 (32/64 ビット)) 最初に、私が達成しようとしていることと、現在どこにいるのかを説明させてください。
モデルに QTableView がバインドされた 2 つのページ (QStackedWidget に挿入されたサブクラス化された QWidget) があります。各ビューは、PostgreSQL サーバーのテーブルにバインドされています。項目の追加・編集・削除・並べ替え・絞り込みができます。各ページは 1 種類のユーザーだけが見ることができます。ロール Role1 と Role2 を呼び出しましょう。
モデルに接続されているすべての送信戦略は OnManualSubmit です。
(トランザクション分離レベル = シリアル化可能。) 2 人のユーザーが (たとえば) 同じ行を編集したい場合、「SELECT ... FOR UPDATE」クエリを実行したい - 誰かが何かを編集したときに、彼が自分の新しいもので変更されます(もしあれば、SVNのように)。しかし、QSqlTableModel の submitAll() メソッドしか表示されません。おそらく、シグナル beforeUpdate()、beforeDelete()、beforeInsert() をキャッチし、手動で「SELECT ... FOR UPDATE」を実行するのが 1 つのオプションです。もう 1 つの方法は、QSqlTableModel をサブクラス化することです。これを達成するためのクリーンで良い方法は何ですか?
各ページの QSqlTableView を定期的に更新したい (最大で 1 つのページが表示され、Role1 ユーザーは Page1 にのみアクセスでき、Role2 => Page2 も同様)。私の頭に浮かんだ最初のことは、QTimer を使用して QSqlTableModel の select() を手動で呼び出すことですが、... これがクールな方法かどうかはわかりません。
また、データベースへの接続が正常かどうかを定期的に確認したいのですが、 QTimer + QSqlDatabase::isOpen () で十分だと思います。
現在、2 つのテーブルには同じ主キーがあり、いくつかの列は同じです。Role1 を持つユーザーが Table1 の行を変更すると、Table2 の対応する列が自動的に変更され、その逆も同様です。Postgres でトリガーを作成する必要がありますか?
ところで、データベースは小さいです - 2 つのテーブルはそれぞれ約 3 ~ 4000 行で、列は 10 個までです (主に varchars、1 つのテキストと 2 つの日付列)。
お読みいただきありがとうございます。明けましておめでとうございます。:)