1

一部のデータを格納するためのデータベース アクセス アプリを作成しており、モデル/ビュー アーキテクチャについていくつか質問したいと思います。

(使用: Qt 4.7.4、独自のビルド; PostgreSQL 9.0; ターゲット: WinXP、Win7 (32/64 ビット)) 最初に、私が達成しようとしていることと、現在どこにいるのかを説明させてください。

モデルに QTableView がバインドされた 2 つのページ (QStackedWidget に挿入されたサブクラス化された QWidget) があります。各ビューは、PostgreSQL サーバーのテーブルにバインドされています。項目の追加・編集・削除・並べ替え・絞り込みができます。各ページは 1 種類のユーザーだけが見ることができます。ロール Role1 と Role2 を呼び出しましょう。

モデルに接続されているすべての送信戦略は OnManualSubmit です。

  1. (トランザクション分離レベル = シリアル化可能。) 2 人のユーザーが (たとえば) 同じ行を編集したい場合、「SELECT ... FOR UPDATE」クエリを実行したい - 誰かが何かを編集したときに、彼が自分の新しいもので変更されます(もしあれば、SVNのように)。しかし、QSqlTableModel の submitAll() メソッドしか表示されません。おそらく、シグナル beforeUpdate()、beforeDelete()、beforeInsert() をキャッチし、手動で「SELECT ... FOR UPDATE」を実行するのが 1 つのオプションです。もう 1 つの方法は、QSqlTableModel をサブクラス化することです。これを達成するためのクリーンで良い方法は何ですか?

  2. 各ページの QSqlTableView を定期的に更新したい (最大で 1 つのページが表示され、Role1 ユーザーは Page1 にのみアクセスでき、Role2 => Page2 も同様)。私の頭に浮かんだ最初のことは、QTimer を使用して QSqlTableModel の select() を手動で呼び出すことですが、... これがクールな方法かどうかはわかりません。

  3. また、データベースへの接続が正常かどうかを定期的に確認したいのですが、 QTimer + QSqlDatabase::isOpen () で十分だと思います。

  4. 現在、2 つのテーブルには同じ主キーがあり、いくつかの列は同じです。Role1 を持つユーザーが Table1 の行を変更すると、Table2 の対応する列が自動的に変更され、その逆も同様です。Postgres でトリガーを作成する必要がありますか?

ところで、データベースは小さいです - 2 つのテーブルはそれぞれ約 3 ~ 4000 行で、列は 10 個までです (主に varchars、1 つのテキストと 2 つの日付列)。

お読みいただきありがとうございます。明けましておめでとうございます。:)

4

1 に答える 1

0

次のようなことを検討する必要があると思います。

モデルとして使用する代わりにQSqlTableModel、独自のモデルを のサブクラスとして実装しQAbstractTableModelます。これにより、データ操作に関してできることを大幅に制御できます。

QAbstractItemDelegateこれが必要とすることの1つは、テーブル内の特定のフィールドに対して、テーブル内のデータの変更を可能にするサブクラスを実装する必要があることです.たとえばprimary key、放っておかなければならない可能性があります。

質問 2 についてはtransaction_counter、すべての行に対して呼び出されるフィールドを実装することをお勧めします。これselectにより、テーブル内のすべての行をtransaction_counter更新する必要がなくなり、行の更新ごとに更新され、新しい行の挿入時に新しい行が挿入されます。必要なことの 1 つは、カウンターがテーブル全体で一意であることです。たとえば、テーブルの初期状態が次の場合: row1 has counter = 0 and row2 has counter = 0. row1が更新された場合はcounterに設定され1ます。がrow1再度更新されるcounterと、 に設定され2ます。row2が更新されたときに などcounterに設定されています。3QTimerこれは、たとえば、あるユーザーが同じロールを持つ別のユーザーと同じテーブルを更新している可能性があるため、データをチェックするのにはるかに有利です。

質問 3 について。カスタム モデルを使用しない理由はわかりません。特に、モデルからデータを分離することにした場合は、表示とは別にデータを操作できます。Data->Model->View->Controller実装の並べ替え。デリゲート用のフィードバック メカニズムがある限り、それぞれを個別に維持できます。

質問 4 について。答えは確かです。または、アプリケーションにトリガーを実装できます。

お役に立てれば。よいお年をお迎えください!

于 2011-12-30T14:22:50.973 に答える