Ich versuche, die user_version der SQLite DB zu überprüfen. Ich habe ein Admin-Tool, um die Version zu stoßen, aber ich verstehe die Syntax der Pragma-Anweisung nicht. Ich erwarte, den Wert in einer if-Anweisung zu testen. Kann jemand ein Codebeispiel bereitstellen? Wenn ich die Pragma-Anweisung in meinen objective-c-Code einbettle, gibt der Compiler einen Fehler aus.Wie benutze ich sqlite3 PRAGMA user_version in Objective-c?
Antwort
Ich fand es heraus mit der Inspiration von Newtover, Graben in FMDB und Re-Lesen der sqlite3 Dokumentation (es ist immer noch sehr vage meiner Meinung nach). Dieser Code gibt den Wert zurück, den ich im Admin-Tool erhalten habe, wenn ich bemerkenswerte Änderungen am Schema vornahm, die eine Migration erfordern.
-(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;
}
Ich habe ein ähnliches Verfahren für die Schema-Version, wo die SQL-Anweisung zu "PRAGMA schema_version;"
Es ist nicht eine gute Idee zu berühren schema_version: http://www.sqlite.org/pragma.html#pragma_user_version –
@AntonChikin von touch, meinst du "schreibgeschützt"? Ich dachte, der Zweck einer Version wäre, den Wert zu lesen und zu testen. Ich habe nicht die Absicht, es zu ändern. Warum sollte ich es nicht anfassen? – mobibob
@mobibob Die sqlite-Website, die Anton verknüpft hat, hat die Antwort auf Ihre Frage, sehen Sie sich den Abschnitt schema_version, zweiten Absatz an: http://www.sqlite.org/pragma.html#pragma_schema_version – davidfg4
Pragma-Anweisungen can not können innerhalb anderer Anweisungen verwendet werden (es gibt keine Verweise auf pragma-stmt aus anderen Anweisungen).
Sie können jedoch den Wert user_version verwenden, indem Sie zwei Anforderungen stellen: Pragma abfragen und den ausgewählten Wert als Literal in der nächsten Abfrage verwenden.
UPD: Wenn Sie in PRAGMA Syntax interessiert sind, es ist ziemlich einfach:
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
, dass das Ergebnis wird mit einem einzigen Wert als Reihe kommen.
Wenn Sie an einer Möglichkeit interessiert sind, Anweisungen an SQLite in objective-c auszustellen, versuchen Sie es mit neighbour questions: example. Leider habe ich nie in Ziel-c codiert.
OK, ich bin so weit bei dir. Aber helfen Sie mir ein bisschen weiter, sagen Sie, dass ich so etwas mache: sqlite3_prepare_v2 (PRAGMA user_version); char * ver = sqlite_column_text (1); kannst du einen Code bereitstellen - ich verstehe das Dokument nicht. – mobibob
geändert Wenn Sie FMDB Wrapper verwenden (die, wenn Sie mit C-Handler beschäftigen nicht empfohlen wollen Schnittstelle von sQLite)
Verwenden
[self.db setUserVersion:yourUserVersion]; // yourUserVersion is of uint32_t type
Um aktuelle user_version Benutzer zu lesen
[self.db userVersion]; // returned value is of uint32_t type
Dokumentation:
http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html
Diese Antwort ist im Grunde dieser Antwort kopieren: https://stackoverflow.com/a/27807125/1364174
ich meine Antwort mit Beispielen aktualisiert. – newtover