2012-04-22 7 views
16

Tengo una clase (ServicesTableModel) que hereda de QSqlRelationalTableModel. En el constructor que tengo:El método QSqlField name() devuelve ""

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

Ahora, si coloco la línea

qDebug() << primaryKey(); 

donde los puntos son llego

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

el cual tiene mucho sentido, pero después de

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

la respuesta es

""

así que no puedo encontrar el nombre de la clave principal.

La mesa es SQLite, que se define con

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

Esto es importante porque estoy tratando de generalizar la clase de objetos estrechamente relacionadas con las filas de una tabla, y parece natural no tener que dar la nombre de clave primaria para el constructor.

Seguramente estoy haciendo algo mal, o no entiendo lo que hace el método name()_ de .

+3

QSqlField tiene una _name() _ método, pero _primaryKey() devuelve un objeto _ QSqlIndex y es su _name() _ método que me estaba llamando. Es por eso que no obtuve una respuesta. Después de _setTable (tableName) _ QSqlTableModel obtiene su clave principal bien, pero para obtener su nombre (bueno, el nombre del campo, que es lo que necesitaba, para poder alimentar solo un número de índice al constructor de mi clase), si es una clave de un campo, uno tiene que llamar a _primaryKey(). fieldName (0) _. Así que solo tuve que prestar más atención y leer los documentos después de descansar. Lo sé. Debería ser una lección para mí. Espero no haber perdido el tiempo de nadie. – Queequeg

+1

está perfectamente bien responder su propia pregunta en una respuesta, para que otros puedan votarlo mejor. –

+0

Debe tener cuidado con QSqlRelationalTableModel. Parece que después de establecer las relaciones 'nombre()' devolverá el nombre del campo de 'tabla de relación' y no de la tabla original. – Funt

Respuesta

1

primaryKey.name() devuelve el nombre del índice.

En SQL, se puede nombrar un índice, y esto es independiente del nombre de los campos utilizados para la clave.

Un índice puede funcionar en varios campos. Cada nombre de campo puede ser recuperado con key.fieldName(i), con 0<i<key.count()

Cuestiones relacionadas