私はいくつかのデータを格納するためのデータベースアクセスアプリケーションを作成しており、モデル/ビューのアーキテクチャについていくつか質問したいと思います。Qt:QSqlTableModel + QTableViewとPostgreSQLとの同期
(Qt 4.7.4を使用、独自のビルド、PostgreSQL 9.0、対象:WinXP、Win7(32/64ビット)) まず、達成しようとしているものと現在のところを説明しましょう。
モデルにバインドされたQTableViewを持つ2つのページ(QStackedWidgetにサブクラス化されたQWidgets)があります。各ビューはPostgreSQLサーバのテーブルにバインドされています。アイテムの追加/編集/削除/並べ替え/フィルタリングが可能です。 各ページは1つのタイプのユーザーのみが見ることができ、ロール1とロール2を呼び出すことができます。
モデルに接続されているすべての送信戦略は、OnManualSubmitです。
(シリアライズ可能トランザクション分離レベル=。)2人のユーザーが(例えば)同じ行を編集したい場合は、私は「SELECT ... FOR UPDATEの」クエリを実行したい - 確認時に誰かことを確認します何かを編集すると、彼は彼の変更を新しいものとマージします(もしあれば、SVNのように)。しかし、QSqlTableModelのsubmitAll()メソッドしか表示されません。 beforeUpdate()、beforeDelete()、beforeInsert()のシグナルを捕捉し、手動で "SELECT ... FOR UPDATE"を実行することが1つのオプションです。 私が考える他の方法は、QSqlTableModelをサブクラス化することです。これを達成するクリーンでいい方法は何ですか?
各ページのQSqlTableViewを定期的に更新する必要があります(1ページは多く見えますが、Role1ユーザーはPage1にのみアクセスでき、Role2 => Page2にもアクセスできます)。 私の頭に浮かんだ最初のことは、QTimerを使用し、手動でQSqlTableModelのselect()を呼び出すことですが、これがクールな方法であるかどうかは分かりません。
また、データベースへの接続が正常かどうかを定期的にチェックしたいと思いますが、QTimer + QSqlDatabase :: isOpen()が実行すると思います。
ここで、2つのテーブルは同じ主キーを持ち、いくつかの列は同じです。 Role1を持つユーザーがTable1の行を変更してTable2の対応する列を自動的に変更したい場合、その逆も欲しい。私はPostgresでトリガーを作成する必要がありますか?
ところで、データベースが小さい - 二つのテーブルの各々は、約10カラム(ほとんどのVARCHAR、1テキスト及び2日colunms)と周りの3から4000行です。
読んでいただきありがとうございました!代わりに、私はQAbstractTableModel
のサブクラスとして私自身のモデルを実装したいモデルとしてQSqlTableModel
を使用しての
::)
こんにちは、大変お返事いただきありがとうございます! Q2について - 「カウンターがテーブル全体でユニークであることが必要なことは何ですか?」とはどういう意味ですか?各行は、それぞれの行とは異なる独自のtransaction_count値を持ちますか? 私のクエリは、「SELECT * FROM table WHERE counter> some-value-here;」のようになります。 ? – Itzuke
基本的にはyesです。すべてが「0」で開始し、次に更新ごとにMAX(カウンタ)+ 1に設定されます – Karlson