2010-04-17 12 views
10

Estoy tratando de verificar la versión de usuario de la base de datos sqlite. Tengo una herramienta de administración para cambiar la versión, pero no entiendo la sintaxis de la declaración pragma. Estoy esperando probar el valor en una declaración if. ¿Alguien puede proporcionar una muestra de código? Cuando inserto la instrucción pragma en mi código object-c, el compilador arroja un error.¿Cómo uso sqlite3 PRAGMA user_version en Objective-c?

+0

He actualizado mi respuesta con ejemplos. – newtover

Respuesta

22

Lo descubrí con la inspiración de newtover, profundizando en FMDB y volviendo a leer la documentación de sqlite3 (sigue siendo muy vaga en mi opinión). Este código devuelve el valor que obtuve en la herramienta de administración cuando realizo cambios notables en el esquema que requieren migración.

-(int)queryUserVersion: (sqlite3*) db { 
    // get current database version of schema 
    static sqlite3_stmt *stmt_version; 
    int databaseVersion; 

    if(sqlite3_prepare_v2(db, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK) { 
     while(sqlite3_step(stmt_version) == SQLITE_ROW) { 
      databaseVersion = sqlite3_column_int(stmt_version, 0); 
      NSLog(@"%s: version %d", __FUNCTION__, databaseVersion); 
     } 
     NSLog(@"%s: the databaseVersion is: %d", __FUNCTION__, databaseVersion); 
    } else { 
     NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(db)); 
    } 
    sqlite3_finalize(stmt_version); 

    return databaseVersion; 
} 

que tienen un método similar para la versión de esquema en el que se cambió la sentencia-sql a "PRAGMA schema_version;"

+1

No es una buena idea tocar schema_version: http://www.sqlite.org/pragma.html#pragma_user_version –

+0

@AntonChikin al tacto, ¿quiere decir "solo lectura"? Pensé que el propósito de tener una versión era leer y probar el valor. No tengo la intención de modificarlo. Compre por qué no debería tocarlo. – mobibob

+0

@mobibob El sitio web de sqlite que Anton enlazó tiene la respuesta a su pregunta, consulte la sección de esquema de versión, segundo párrafo: http://www.sqlite.org/pragma.html#pragma_schema_version – davidfg4

4

Pragma declaraciones can not ser utilizado en otras declaraciones (no hay referencias a pragma-stmt de otras declaraciones).

Pero puede usar el valor de la versión de usuario haciendo dos solicitudes: consultar pragma y usar el valor seleccionado como literal en la consulta siguiente.

UPD: si está interesado en la sintaxis de PRAGMA, es bastante simple:

sqlite> pragma user_version=10; 
sqlite> pragma user_version; 
user_version 
------------------------------ 
10 
sqlite> pragma user_version='12.3.124'; 
sqlite> pragma user_version; 
user_version 
------------------------------ 
12 

Ese es el resultado será una fila con un solo valor.

Si está interesado en una forma de emitir sentencias a SQLite en objetivo-c, intente mirar neighbour questions: example. Desafortunadamente, nunca he codificado Object-c.

+0

OK, estoy contigo hasta ahora. Pero ayúdame un poco más, ¿estás diciendo que hago algo como: sqlite3_prepare_v2 (PRAGMA user_version); char * ver = sqlite_column_text (1); ¿Puedes proporcionar algún código? No entiendo el documento. – mobibob

0

Si está utilizando FMDB envoltura (que se recomienda si usted no quiere tratar con controlador C interfaz de SQLite)

uso

[self.db setUserVersion:yourUserVersion]; // yourUserVersion is of uint32_t type 

Para leer el usuario actual user_version

[self.db userVersion];     // returned value is of uint32_t type 

Documentación:

http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html

Esta respuesta es básicamente copia de esta respuesta: https://stackoverflow.com/a/27807125/1364174