【问题标题】:Setting user_version in sqlite在 sqlite 中设置 user_version
【发布时间】:2014-02-06 08:34:41
【问题描述】:

我在这里看到了有关阅读 user_version 的其他问题,这对我来说似乎工作正常。但是我正在尝试在 FMDB 中使用 sqlite 来设置我的版本号,但它没有设置。

_db = [self openDatabase];
[_db executeUpdate:[StudentController creationString]];
[_db executeUpdate:[ReadingController creationString]];
[_db executeUpdate:[SessionController creationString]];
NSLog(@"User version is %i", userVersion);
NSString *query = [NSString stringWithFormat:@"PRAGMA USER_VERSION = %i", userVersion];
[_db executeQuery:query];

我得到的输出是:

2014-01-16 22:16:25.438 MyApp[2810:1c103] User version is 2
2014-01-16 22:16:25.439 MyApp[2810:1c103] Query is PRAGMA USER_VERSION = 2
2014-01-16 22:18:09.272 MyApp[2810:1c103] Database copied and created

在运行应用程序一段时间后,数据库保存和加载都很好,我重新启动应用程序并读取版本号并调用它来检查版本号:

FMResultSet *ps = [_db executeQuery:@"PRAGMA USER_VERSION"];

NSDictionary *results = [[NSDictionary alloc] init];
while ([ps next]) {
     results = [NSDictionary dictionaryWithDictionary:[ps resultDictionary]];
}

结果是一个格式很好的字典:

(lldb) po results
$0 = 0x09bf5770 {
    "user_version" = 0;
}
(lldb) 

我想知道:为什么没有为我设置用户版本号?

【问题讨论】:

    标签: ios sqlite fmdb


    【解决方案1】:

    如果需要设置 PRAGMA user_version 使用:

    [self.db setUserVersion:yourUserVersion]; // yourUserVersion is of uint32_t type
    

    读取当前user_version用户

    [self.db userVersion];                   // returned value is of uint32_t type
    

    FMDB 从 2013 年开始对其进行封装,因此您不必自己处理。

    文档:

    http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html

    PS:@HalR 我认为您可以接受我的回答,因为它对于搜索“如何设置 user_version PRAGMA”的访问者可能更有用,并且它还可以通过更简洁的解决方案解决您的问题。

    【讨论】:

    • 我使用 FMDB 2.7.2,重启应用后 userVersion 回滚。有什么想法吗?
    【解决方案2】:

    当我发现问题时,我正要发布赏金。就像经常发生的那样,我只是个傻瓜

    我在 executeQuery 做我应该做 executeUpdate 的地方

    _db = [self openDatabase];
    [_db executeUpdate:[StudentController creationString]];
    [_db executeUpdate:[ReadingController creationString]];
    [_db executeUpdate:[SessionController creationString]];
    NSLog(@"User version is %i", userVersion);
    NSString *query = [NSString stringWithFormat:@"PRAGMA USER_VERSION = %i", userVersion];
    [_db executeQuery:query];
    

    应该是:

    _db = [self openDatabase];
    [_db executeUpdate:[StudentController creationString]];
    [_db executeUpdate:[ReadingController creationString]];
    [_db executeUpdate:[SessionController creationString]];
    NSLog(@"User version is %i", userVersion);
    NSString *query = [NSString stringWithFormat:@"PRAGMA USER_VERSION = %i", userVersion];
    [_db executeUpdate:query];
    

    执行Pragma 不是查询,executeQuery 不会对它做任何事情。相反,它与UPDATEINSERTDELETE 属于同一类别。

    【讨论】:

    • 我认为你只是复制/过去了同一个块两次。那么,正确的方法应该是什么?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2014-11-16
    • 2010-10-16
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多