我在一个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 error or missing database“。给出的消息是:‘没有这样的表:类别’。
现在,如果我查看计算机上的数据库文件,表显然就在那里。我也可以对它运行完全相同的查询,并且它工作正常。
有没有人知道哪里出了问题?
谢谢。
发布于 2012-07-03 23:09:11
所以错误是它没有复制数据库文件。我仍然不知道为什么它不是。幸运的是,我有幸能够以编程方式创建数据库文件。这样做就解决了问题。但是,我不确定为什么文件不能复制。
发布于 2012-07-03 22:08:25
如果您在添加[[NSFileManager defaultManager] fileExistsAtPath:databasePath]检查之前运行过此代码,则标准sqlite3_open将为您创建一个空白数据库(如果找不到)。所以,
sqlite3_open命令将创建空白数据库。为安全起见,将来请改用sqlite3_open_v2,它永远不会创建空白数据库:if (sqlite3_open_v2(databasePath UTF8String,&database,SQLITE_OPEN_READWRITE,NULL) != SQLITE_OK) { //在此处处理打开错误}
通过使用sqlite3_open_v2,它将确保在打开过程中永远不会创建数据库。
chflags nohidden ~/库
尝试检查那里的数据库(而不是Xcode项目中的版本),看看数据库是否包含您期望的所有表。
SQLITE_ERROR,请始终通过诸如SQLITE_ERROR之类的工具检查错误详细信息https://stackoverflow.com/questions/11310893
复制相似问题