J'essaie de vérifier l'utilisateur_version de la DB SQLite. J'ai un outil d'administrateur pour cogner la version, mais je ne comprends pas la syntaxe de la déclaration de pragma. Je m'attends à tester la valeur dans une déclaration IF. Quelqu'un peut-il fournir un échantillon de code? Lorsque j'ai incorporé la déclaration de pragma dans mon code Objective-C, le compilateur jette une erreur. P>
3 Réponses :
déclarations de pragma ne peut pas être utilisé dans d'autres déclarations (il n'y a pas de Références à Pragma-STMT à partir d'autres déclarations).
Mais vous pouvez utiliser la valeur utilisateur_version en effectuant deux demandes: interroger pragma et à l'aide de la valeur sélectionnée comme littéral dans la requête suivante. P>
c'est le résultat viendra comme une ligne avec une seule valeur. P > Si vous êtes intéressé par un moyen d'émettre des déclarations à SQLite dans l'objectif-c, essayez de regarder Questions de voisin A>: exemple . Malheureusement, je n'ai jamais codé dans l'objectif-c. P> p>
Ok, je suis avec toi jusqu'à présent. Mais aidez-moi un peu plus loin, dis-tu que je fais quelque chose comme: sqlite3_prepare_v2 (pragma user_version); char * ver = sqlite_column_text (1); Pouvez-vous fournir du code - je ne comprends pas le doc.
Je l'ai compris avec l'inspiration de Newtover, creusant dans la DMDB et relecture de la documentation SQLite3 em> (c'est toujours très vague à mon avis). Ce code renvoie la valeur que j'ai heurtée dans l'outil administrateur lorsque je modifie notable au schéma nécessitant une migration. -(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;
}
Ce n'est pas une bonne idée de toucher Schema_version: SQLITE.ORG/PRAGMA.HTML#PRAGMA_USER_VERSION
@Antonchikin par toucher, tu veux dire "en lecture seule"? Je pensais que le but d'avoir une version était de lire et de tester la valeur. Je n'ai pas l'intention de le modifier. Achetez pourquoi je ne devrais-je pas le toucher?
@MobibiBOB Le site Web SQLITE que Anton liait a la réponse à votre question, consultez la section Schema_version, deuxième paragraphe: sqlite.org/pragma.html#pragma_schema_version
@ Davidfg4 Comme je pensais (je le répète en 2010) L'avertissement est contre la modification. Il n'y a pas de problème avec lecture seule, "... en utilisant" Pragma Schema_version "pour modifier la version de schéma ..."
@mobibobob Comment puis-je mettre à jour la version utilisateur de SQLite Programmatiquement?
Si vous utilisez Wrapper FMDB (qui est recommandé si vous ne souhaitez pas faire face à une interface de logement C de SQLite)
Utiliser P>
[self.db userVersion]; // returned value is of uint32_t type
J'ai mis à jour ma réponse avec des exemples.