2012-04-22 17 views
16

Mam klasę (ServicesTableModel), która dziedziczy po QSqlRelationalTableModel. W konstruktorze mam:Metoda nazwy QSqlField zwraca ""

ServicesTableModel::ServicesTableModel(QWidget* parent, QSqlDatabase db) 
: QSqlRelationalTableModel(parent, db) 
{ 
    setTable("servicios"); 
    select(); 
    ... 
} 

Teraz, jeśli umieścić linię

qDebug() << primaryKey(); 

gdzie kropki to mam

QSqlRecord(1) 
" 0:" QSqlField("ser_id", int, required: no, generated: yes) 

co sprawia sens, ale po

qDebug() << primaryKey().name(); 

odpowiedź brzmi

""

, więc nie mogę dotrzeć do nazwy klucza podstawowego.

Stół jest SQLite, zdefiniowany

CREATE TABLE servicios (ser_id integer primary key, ...) 

To ważne, ponieważ staram się uogólniać klasę dla obiektów ściśle związanych z wierszy w tabeli, a to wydaje się naturalne nie muszą zapewnić nazwa klucza podstawowego do konstruktora.

Pewnie robię coś nie tak, lub nie rozumiem, co robi metoda name()_ z QSqlField.

+3

QSqlField ma _name() _ metoda, ale _primaryKey() _ zwraca obiekt QSqlIndex i to jest jego _name() _ sposób, że dzwoni. Dlatego nie dostałem odpowiedzi. Po _setTable (tableName) _ QSqlTableModel pobiera swój klucz podstawowy w porządku, ale żeby uzyskać jego nazwę (dobrze, nazwa pola, która jest tym, czego potrzebowałem, aby móc podać tylko numer indeksu do konstruktora mojej klasy), jeśli jest to jeden klucz pola, należy wywołać _primaryKey(). fieldName (0) _. Więc musiałem tylko zapłacić nieco więcej atention i przeczytać dokumenty po odpoczynku. Wiem. To powinna być dla mnie lekcja. Mam nadzieję, że nie straciłem czasu. – Queequeg

+1

jest całkowicie OK, aby odpowiedzieć na własne pytanie w odpowiedzi, aby inni mogli go przyjąć. –

+0

Powinieneś być ostrożny z QSqlRelationalTableModel. Wydaje się, że po ustawieniu relacji 'name()' zwróci nazwę pola z 'relacji tabeli', a nie z oryginalnej tabeli. – Funt

Odpowiedz

1

primaryKey.name() zwraca nazwę indeksu.

W SQL można nazwać indeks, który jest niezależny od nazwy pól użytych dla klucza.

Indeks może działać na kilku polach. Każda nazwa pola mogą być pobierane z key.fieldName(i) z 0<i<key.count()

Powiązane problemy