sqlite DB の user_version を確認しようとしています。バージョンを上げるための管理ツールがありますが、プラグマ ステートメントの構文がわかりません。ifステートメントで値をテストすることを期待しています。誰かがコードサンプルを提供できますか? 目的の C コードにプラグマ ステートメントを埋め込むと、コンパイラがエラーをスローします。
3 に答える
newtover からインスピレーションを得て、FMDB を掘り下げ、sqlite3のドキュメントを読み直しました (私の意見では、まだ非常に漠然としています)。このコードは、移行が必要なスキーマに重要な変更を加えたときに、管理ツールでバンプした値を返します。
-(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;
}
SQLステートメントが変更されたスキーマバージョンにも同様の方法があります"PRAGMA schema_version;"
プラグマ ステートメントは、他のステートメント内では使用できません(他のステートメントから pragma-stmt への参照はありません)。
ただし、プラグマのクエリと、次のクエリで選択した値をリテラルとして使用するという 2 つの要求を行うことで、user_version 値を使用できます。
UPD : PRAGMA 構文に興味がある場合は、かなり単純です。
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
つまり、結果は単一の値を持つ行として返されます。
Objective-C で SQLite にステートメントを発行する方法に興味がある場合は、neighbor questionを見てみてください: example。残念ながら、私は Objective-C でコーディングしたことがありません。
FMDB ラッパーを使用している場合 (sqlite の C ハンドラー インターフェイスを扱いたくない場合に推奨されます)
使用する
[self.db setUserVersion:yourUserVersion]; // yourUserVersion is of uint32_t type
現在の user_version ユーザーを読み取るには
[self.db userVersion]; // returned value is of uint32_t type
ドキュメンテーション:
http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html
この回答は、基本的にこの回答のコピーです: https://stackoverflow.com/a/27807125/1364174