我正在尝试检查 sqlite DB 的 user_version。我有一个管理工具来提升版本,但我不明白 pragma 语句的语法。我期待在 if 语句中测试该值。有人可以提供代码示例吗?当我在我的 Objective-C 代码中嵌入 pragma 语句时,编译器会抛出一个错误。
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 语句不能在其他语句中使用(其他语句中没有对 pragma-stmt 的引用)。
但是您可以通过发出两个请求来使用 user_version 值:查询 pragma 并在下一个查询中使用所选值作为文字。
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 发出语句的方式感兴趣,请尝试查看邻居问题: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