Seite 1 von 1

SQL und QTreeView

Verfasst: 9. Mai 2007 08:45
von Lodur
Hallo erstmal :)

Ich habe folgendes Problem. In einer SQL-Datenbank (Sqlite) stehen zwei Tabellen die zusammen eine Baumstruktur bilden. Mit der ersten Tabelle wird eine Art "Verzeichnisstruktur" aufgebaut und in der zweiten stehen die "Dateien".

ItemCategory (Id, ParentId, Name)
Item (Id, CategoryId, Name, ...)

Ich möchte gerne ein QTreeView und ein passendes Model verwenden um diese Struktur anzuzeigen. Mit den vorhanden Modellen QSqlQueryModel und QSqlTableModel bzw. QSqlRelationalTableModel komme ich nicht weiter.

Mein Gedanke war es nun ein neues Model von QAbstractTableModel abzuleiten. Wobei ich im QModelIndex als InternaId die CategoryId sichere und für jeden Teilbaum ein eigenes QSqlQueryModel verwende. Das scheint mir aber zu aufwendig, da jedes Blatt des "Verzeichnisbaums" ein QSqlQueryModel benötigt wird.

Gibt es eine einfacher Lösung? Hat schon jemand Erfahrung mit Bäumen in Datenbanktabellen. Mit Qt selber und normalen Datenbanktabellen habe ich keine Probleme, nur dies ist ein wenig kniffelig ...

Verfasst: 9. Mai 2007 09:05
von upsala
Richte dich nach diesem Beispiel. Eine bessere Möglichkeit habe ich auch noch nicht gefunden.

Verfasst: 9. Mai 2007 10:23
von Lodur
Da hab' ich auch schon dran gedacht. Den Baum aus der Tabelle zu lesen und unabhängig von einem SQL-Modell in einem eigenen Modell zu speichern. Dann muss aber das Baummodell und das SQL-Modell immer synchron gehalten werden. Das sollte sich über Singals/Slots aber machen lassen.

Die Idee gefiel mir nur nicht, weil ich dann alle Daten doppelt halten muss, einmal im Baum- und einmal im SQL-Modell. Aber wirklich drum rum komme ich wohl nicht ...

Was macht das SQL-Modell intern? Cached es lokal die gesamte Tabelle als Query oder kommuniziert es bei jeder Anfrage für ein Record mit dem Datenbanktreiber? Wenn letzteres, würden die Daten ja gar nicht doppelt gespeichert.

Verfasst: 9. Mai 2007 12:21
von upsala
Das schöne an Qt ist, daß man in die Sourcen reinschaun kann. Das schöne an z.B. MySQL ist, daß die Abfragen mitverfolgen kann.

Aber ich verrate es dir trotzdem QSqlQueryModel cached die Daten.

Du könntest ja hergehen und in deinem Baum nur die Priary Id jedes Datensatzes abzulegen und bei jeder Abfrage eine Query abzusetzen. Da würde ich aber auf jeden Fall noch einen Cache (QCache) dazuwischenschalten und wenn möglich nicht immer nur einen Datensatz sondern gleich mehrere Abfragen. Sonst sieht es mit der Performance auf einmal gar nicht mehr so toll aus.

Verfasst: 9. Mai 2007 15:54
von Lodur
Das schöne an Qt ist, dass ich bisher nur mit den vorkompilierten Bibliotheken ausgekommen bin, ohne mich durch die Quelltexte zu wühlen ;)

Aber ich schaue mal rein wie QSqlQuery cached. Die Idee mit QCache gefällt mir dagegen fast besser. Im Baummodell würden dann die "Verzeichnisse" liegen und im Cache die "Dateien" ...