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?
Respuesta
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;"
No es una buena idea tocar schema_version: http://www.sqlite.org/pragma.html#pragma_user_version –
@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
@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
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.
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
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
- 1. No se puede usar la sustitución del parámetro sqlite3 con PRAGMA?
- 2. Uso de #pragma en C
- 3. OpenMP: uso condicional de #pragma
- 4. uso lib con si pragma en Perl
- 5. Pros y contras del uso de excepción en IOS/ObjectiveC
- 6. ¿Cómo puedo recuperar y configurar user_version en SQLite DB con EF
- 7. El uso de Pragma-s de SQLite en C#
- 8. Uso de librerías estáticas C/C++ desde iPhone Aplicaciones ObjectiveC
- 9. ¿Cómo funciona Perl's lib pragma?
- 10. Bloques ObjectiveC equivalente en Java
- 11. Uso de la biblioteca compartida en Gyp en node-sqlite3
- 12. ¿Cómo instalo SQlite3 para Ruby on Rails mientras uso RVM
- 13. Uso de puntos de guardado en python sqlite3
- 14. Pragma en definir macro
- 15. ¿Debo usar "#pragma GCC ..." o "#pragma clang ..." en Xcode
- 16. codificación de uso de Perl pragma rompiendo cadenas UTF
- 17. sqlite3 y cursor.description
- 18. Cómo optimizar una consulta SQLite3
- 19. objectivec: fb publicar comentario error
- 20. ObjectiveC Parse Integer from String
- 21. sqlite3 en Python
- 22. Cómo dividir la nueva línea de NSString en ObjectiveC
- 23. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 24. #pragma dentro #define
- 25. ¿Qué significa #pragma en C?
- 26. Xcode - Usando #pragma mark
- 27. Uso de sqlite3 con IronPython 2.6 para .Net4
- 28. Tabla cruzada en Sqlite3
- 29. ¿Cómo crear uno a muchos en SQLITE3?
- 30. ¿Cómo instalar la gema sqlite3 en EC2?
He actualizado mi respuesta con ejemplos. – newtover