iOS Sqlite3 SQLITE_ERROR

我有一个iOS应用程序的function,从数据库中读取一些数据。 该function非常简单:

-(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错误或缺less数据库”。 给出的信息是:'没有这样的表:类别'

现在,如果我查看我的电脑上的数据库文件,表格显然在那里。 我也可以运行完全相同的查询,它可以正常工作。

有没有人有什么问题出错?

谢谢。

如果您在添加[[NSFileManager defaultManager] fileExistsAtPath:databasePath]检查之前运行过这个代码,标准sqlite3_open将为您创build一个空白数据库,如果它没有find。 所以,

  1. 通过模拟器菜单上的“重置内容和设置…”重置您的模拟器。 这将清除可能在过去创build的任何无关的数据库文件。 (如果您在设备上执行此操作,请删除该应用程序,然后重新安装。)

  2. sqlite3_open命令将创build空白数据库,如果没有find。 为了安全起见,将来可以使用sqlite3_open_v2 ,它永远不会创build一个空白的数据库:

     if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { // handle opening error here } 

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

  3. 如果仍有问题,请导航到您计算机上的模拟器目录,即“〜/ Library / Application Support / iPhone Simulator”。 (您可能需要通过在terminal窗口中键入以下命令来取消隐藏库文件夹:

     chflags nohidden ~/Library 

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

  4. 如果在完成所有这些之后,没有将数据库复制到模拟器/设备,请确保已经设置了目标的“构build阶段”设置,以便通过“复制软件包资源”包含数据库。

  5. 正如其他人所说,每当你得到SQLITE_ERROR ,总是通过类似NSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));检查错误的细节NSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));

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