【问题标题】:How do I use sqlite3 PRAGMA user_version in Objective-c?如何在 Objective-c 中使用 sqlite3 PRAGMA user_version?
【发布时间】:2011-02-09 05:29:33
【问题描述】:

我正在尝试检查 sqlite DB 的 user_version。我有一个管理工具来提升版本,但我不明白 pragma 语句的语法。我期待在 if 语句中测试该值。有人可以提供代码示例吗?当我在我的 Objective-C 代码中嵌入 pragma 语句时,编译器会抛出一个错误。

【问题讨论】:

  • 我用例子更新了我的答案。

标签: iphone objective-c sqlite pragma


【解决方案1】:

我是在 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-statement 更改为"PRAGMA schema_version;"

【讨论】:

  • 触摸 schema_version 不是一个好主意:sqlite.org/pragma.html#pragma_user_version
  • @AntonChikin 通过触摸,您的意思是“只读”吗?我认为拥有一个版本的目的是阅读和测试价值。我不打算修改它。买我为什么不碰它。
  • @mobibob Anton 链接的 sqlite 网站有你问题的答案,查看 schema_version 部分,第二段:sqlite.org/pragma.html#pragma_schema_version
  • @davidfg4 就像我想的那样(我在 2010 年读过这篇文章)警告是反对修改的。只读没有任何问题,“......使用“PRAGMA schema_version”来修改模式版本......”
  • @mobibob 如何以编程方式更新 sqlite 的 user_version ?
【解决方案2】:

Pragma 语句 can not 可在其他语句中使用(其他语句中没有对 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 发出语句的方式感兴趣,请尝试查看 neighbour questions:example。不幸的是,我从来没有用 Objective-c 写过代码。

【讨论】:

  • 好的,到目前为止我和你在一起。但是请进一步帮助我,您是说我做了类似的事情: sqlite3_prepare_v2(PRAGMA user_version);字符 *ver = sqlite_column_text(1);你能提供一些代码吗——我不明白文档。
【解决方案3】:

如果你正在使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多