首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS Sqlite3 SQLITE_ERROR

iOS Sqlite3 SQLITE_ERROR
EN

Stack Overflow用户
提问于 2012-07-03 20:26:43
回答 2查看 5K关注 0票数 0

我在一个iOS应用程序中有一个函数,可以从数据库中读取一些数据。这个函数非常简单:

代码语言:javascript
复制
-(void) readCategories {
    sqlite3 *database;

    if([[NSFileManager defaultManager] fileExistsAtPath:databasePath]){
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
            const char *sqlStatement = "SELECT * FROM Categories ORDER BY name COLLATE NOCASE ASC";
            sqlite3_stmt *compiledStatement;
            int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);

            if(errorCode == SQLITE_OK) {
                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    [categories addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
                }
            } else {
                 NSLog(@"Error reading categories. Code: %d, message: '%s'", errorCode,sqlite3_errmsg(database));
            }
            sqlite3_finalize(compiledStatement);
            sqlite3_close(database);
        } else {
            NSLog(@"Error opening DB");
        }
    } else {
        NSLog(@"DB does not exist.");
    }
}

问题是errorCode总是SQLITE_ERROR,根据文档是:"SQL error or missing database“。给出的消息是:‘没有这样的表:类别’。

现在,如果我查看计算机上的数据库文件,表显然就在那里。我也可以对它运行完全相同的查询,并且它工作正常。

有没有人知道哪里出了问题?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 23:09:11

所以错误是它没有复制数据库文件。我仍然不知道为什么它不是。幸运的是,我有幸能够以编程方式创建数据库文件。这样做就解决了问题。但是,我不确定为什么文件不能复制。

票数 0
EN

Stack Overflow用户

发布于 2012-07-03 22:08:25

如果您在添加[[NSFileManager defaultManager] fileExistsAtPath:databasePath]检查之前运行过此代码,则标准sqlite3_open将为您创建一个空白数据库(如果找不到)。所以,

  1. 通过“重置内容和设置...”重置模拟器在模拟器的菜单上。这将清除过去可能创建的任何无关的数据库文件。(如果您在设备上执行此操作,请删除应用程序,然后重新安装它。)
  2. 如果找不到空白数据库,sqlite3_open命令将创建空白数据库。为安全起见,将来请改用sqlite3_open_v2,它永远不会创建空白数据库:

if (sqlite3_open_v2(databasePath UTF8String,&database,SQLITE_OPEN_READWRITE,NULL) != SQLITE_OK) { //在此处处理打开错误}

通过使用sqlite3_open_v2,它将确保在打开过程中永远不会创建数据库。

  • 如果您仍然有问题,请导航到您计算机上的模拟器目录,即“~/库/应用程序支持/iPhone模拟器”。(您可能需要通过在终端窗口中键入以下命令来取消隐藏Library文件夹:

chflags nohidden ~/库

尝试检查那里的数据库(而不是Xcode项目中的版本),看看数据库是否包含您期望的所有表。

  • 如果在完成所有这些操作后,您没有看到数据库被复制到您的模拟器/设备,请确保您已经设置了目标的构建阶段设置,以便通过"Copy Bundle Resources".

  • As“包含数据库。其他人建议,无论何时获得SQLITE_ERROR,请始终通过诸如SQLITE_ERROR之类的工具检查错误详细信息
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11310893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档