12
votes

Comment utiliser SQLite3 Pragma User_version dans Objective-C?

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.


1 commentaires

J'ai mis à jour ma réponse avec des exemples.


3 Réponses :


4
votes

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.

UPD : Si vous êtes intéressé par la syntaxe de pragma, c'est plutôt simple: xxx

c'est le résultat viendra comme une ligne avec une seule valeur.

Si vous êtes intéressé par un moyen d'émettre des déclarations à SQLite dans l'objectif-c, essayez de regarder Questions de voisin : exemple . Malheureusement, je n'ai jamais codé dans l'objectif-c.


1 commentaires

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.



22
votes

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;
}


5 commentaires

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?



3
votes

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


0 commentaires