我在iOS应用程序中有一个函数,它从数据库中读取一些数据。功能非常简单:
-(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错误或缺少数据库"。给出的信息是:'没有这样的表格:类别'
现在,如果我查看计算机上的数据库文件,表格显然就在那里。我也可以对它运行完全相同的查询,它可以正常工作。
有没有人对出了什么问题有任何想法?
感谢。
答案 0 :(得分:3)
如果您在添加[[NSFileManager defaultManager] fileExistsAtPath:databasePath]
检查之前运行过此代码,标准sqlite3_open
将为您创建一个空白数据库(如果找不到)。所以,
通过模拟器菜单上的“重置内容和设置...”重置模拟器。这将清除可能在过去创建的任何无关的数据库文件。 (如果您在设备上执行此操作,请删除该应用,然后重新安装。)
sqlite3_open
命令将创建空白数据库(如果找不到)。为了安全起见,将来使用sqlite3_open_v2
代替,永远不会创建空白数据库:
if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
// handle opening error here
}
通过使用sqlite3_open_v2
,它将确保在打开过程中永远不会创建数据库。
如果您仍然遇到问题,请导航到您计算机上的模拟器目录,即“〜/ Library / Application Support / iPhone Simulator”。 (您可能必须通过在终端窗口中键入以下命令来取消隐藏您的Library文件夹:
chflags nohidden ~/Library
尝试检查那里的数据库(而不是Xcode项目中的版本),看看数据库是否包含您期望的所有表格。
如果在完成所有这些操作后,您没有看到您的数据库被复制到您的模拟器/设备,请确保您已设置目标的Build Phases设置,以便通过“Copy Bundle Resources”包含数据库”
正如其他人所建议的那样,每当您获得SQLITE_ERROR
时,请务必通过类似NSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));
的内容查看错误详情。
答案 1 :(得分:0)
所以错误是它没有复制数据库文件。我仍然不知道为什么不是。幸运的是,我能够以编程方式创建数据库文件。这样做解决了这个问题。不知道为什么文件不会复制。