2011-12-30 8 views
1

私はいくつかのデータを格納するためのデータベースアクセスアプリケーションを作成しており、モデル/ビューのアーキテクチャについていくつか質問したいと思います。Qt:QSqlTableModel + QTableViewとPostgreSQLとの同期

(Qt 4.7.4を使用、独自のビルド、PostgreSQL 9.0、対象:WinXP、Win7(32/64ビット)) まず、達成しようとしているものと現在のところを説明しましょう。

モデルにバインドされたQTableViewを持つ2つのページ(QStackedWidgetにサブクラス化されたQWidgets)があります。各ビューはPostgreSQLサーバのテーブルにバインドされています。アイテムの追加/編集/削除/並べ替え/フィルタリングが可能です。 各ページは1つのタイプのユーザーのみが見ることができ、ロール1とロール2を呼び出すことができます。

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

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

  2. 各ページのQSqlTableViewを定期的に更新する必要があります(1ページは多く見えますが、Role1ユーザーはPage1にのみアクセスでき、Role2 => Page2にもアクセスできます)。 私の頭に浮かんだ最初のことは、QTimerを使用し、手動でQSqlTableModelのselect()を呼び出すことですが、これがクールな方法であるかどうかは分かりません。

  3. また、データベースへの接続が正常かどうかを定期的にチェックしたいと思いますが、QTimer + QSqlDatabase :: isOpen()が実行すると思います。

  4. ここで、2つのテーブルは同じ主キーを持ち、いくつかの列は同じです。 Role1を持つユーザーがTable1の行を変更してTable2の対応する列を自動的に変更したい場合、その逆も欲しい。私はPostgresでトリガーを作成する必要がありますか?

ところで、データベースが小さい - 二つのテーブルの各々は、約10カラム(ほとんどのVARCHAR、1テキスト及び2日colunms)と周りの3から4000行です。

読んでいただきありがとうございました!代わりに、私はQAbstractTableModelのサブクラスとして私自身のモデルを実装したいモデルとしてQSqlTableModelを使用しての

::)

答えて

0

私はあなたが次の何かを行うことを検討すべきだと思います。これにより、データ操作の面でできることを多く制御できます。

テーブルの特定のフィールドには、サブタイプを実装する必要があります。サブタイプをQAbstractItemDelegateとすると、テーブル内のデータを変更できるようになります。ユーザーの更新を許可したくないと確信しています例えばprimary keyのようなテーブルのフィールドは、おそらく単独で放置されなければならない。あなたはtransaction_counterは、すべての行の更新時に更新され、新しいものがされるだけで更新するもの表にselectにすべての行を持っていないので、私はフィールドを実装することをお勧め質問2については

は、行ごとにtransaction_counterと呼ばれます新しい行挿入部に挿入されます。必要とされることの1つは、カウンタがテーブル全体で一意であることです。たとえば、テーブルの初期状態がrow1 has counter = 0 and row2 has counter = 0の場合です。 row1counterに更新された場合、1に設定されます。 row1が再び更新されると、counter2に設定されます。 row2が更新されたときが3などに設定されました。QTimerを使用して確実にデータの更新を行うことができます。これは、あるユーザーが別のユーザーと同じテーブルを更新している可能性があるため同じ役割で

質問3私はカスタムモデルではない理由は何もなく、特にデータをモデルから切り離すことに決めた場合は、データを表示とは別に操作することができます。ソートData->Model->View->Controllerの実装。代理人のためのフィードバックメカニズムがある限り、それぞれを個別に管理することができます。

質問4.答えがわかりましたか、アプリケーションでトリガーを実装できます。

これが役に立ちます。素晴らしい新年を!

+0

こんにちは、大変お返事いただきありがとうございます! Q2について - 「カウンターがテーブル全体でユニークであることが必要なことは何ですか?」とはどういう意味ですか?各行は、それぞれの行とは異なる独自のtransaction_count値を持ちますか? 私のクエリは、「SELECT * FROM table WHERE counter> some-value-here;」のようになります。 ? – Itzuke

+0

基本的にはyesです。すべてが「0」で開始し、次に更新ごとにMAX(カウンタ)+ 1に設定されます – Karlson

関連する問題