2016-08-04 9 views
0

Ich verwende Qt Model View Programmierung für eine Datenbank, wo ein Objekt mit mehreren Tabellen dargestellt wird. Angenommen, die folgenden Objekt und coresponding Datenbanktabellen, die perfekt mein Design passen:QSqlTableModel für mehrere Tabellen

TagObject 
    - id 
    - name 
    - usable 
    - information 

tag_table 
    - id 
    - name 
    - usable 

tag_info_table 
    - id_ref 
    - info 

Wie Sie sehen können, die Informationen Eigenschaft in einer anderen Tabelle getrennt Existenz von NULL zu verhindern weil diese Eigenschaft ist optional.

In der Datenbank habe ich eine Ansicht, die die Werte in eine 'Tabelle' aggregiert, die mit QSqlTableModel abgefragt werden kann. Beachten Sie, dass Daten auf diese Weise nicht möglich sind. Soweit ich das verstehen konnte, wird der Datenbankentwurf von Qt's Klassen nicht unterstützt, weder QSqlTableModel noch QSqlRelationalTableModel unterstützen dies. (Zusätzlich QSqlQueryModel unterstützt keine Einsätze überhaupt, so ist dies nicht in Frage.)

Fehle ich etwas? Gibt es eine Möglichkeit, dies mit den SQL-Klassen von Qt zu tun? Oder ist der einzige Weg, um diese Unterklasse zu erreichen QSqlQueryModel wie hingewiesen here?

Das Modell ist standardmäßig schreibgeschützt. Um es lesend/schreibend zu machen, müssen Sie es ableiten und setData() und flags() neu implementieren. Eine andere Option ist die Verwendung von QSqlTableModel, das ein Lese-Schreib-Modell basierend auf einer einzelnen Datenbanktabelle bereitstellt.


Edit: Was Subklassifizieren finde ich this reference als ein schönen Einstiegspunkt.

Antwort

2

Idealerweise sollte die Ansicht über geeignete Trigger verfügen, die die zugrunde liegenden Tabellen ändern. Machen Sie die Ansicht beschreibbar und Ihre Probleme verschwinden: Sie können dann direkt eine QSqlTableModel in dieser Ansicht verwenden.

Alternativ können Sie für jede Tabelle eine QSqlTableModel haben und dann ein benutzerdefiniertes Proxy-Modell schreiben, das Einfügungen und Umsetzungen zwischen den Quellmodellen unterstützt und die beschreibbare Ansicht bildet. Es wird mehr Arbeit als das Schreiben der SQL-Trigger.

+0

Zwei nette Annäherungen, die zu meiner unterschiedlich sind, nett. Ich werde das untersuchen. – maxik

+0

Ich endete mit einer Triggerfunktion auf der Ansicht, die perfekt funktioniert. Ich mag die Tatsache, so viel Logik wie möglich in die Datenbank zu bringen. Vielen Dank! – maxik

+1

Kam in eine andere Frage, die verwandt ist, denke ich: Verwenden von getriggerten Ansichten, wie mit * n: m * Relationen zu behandeln, die nicht in der Ansicht sind? Irgendein guter Weg, sie in einen zu bekommen? Ich habe * Ersatzschlüssel * -Tabellen, die IDs von zwei Tabellen abbilden, um die Beziehung zu erhalten. – maxik