有一个sqlite问题。查询在firefox插件SQLiteManager上运行正常。但它不能在iOS上运行。我得到一个错误代码1.数据库连接正常。
NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"featureDB"
ofType:@"sqlite3"];
if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
DLog(@"Failed to open database!");
} else {
DLog(@"Connected to db");
}
NSString *query = [NSString stringWithFormat:@"SELECT * FROM featureTable"];
sqlite3_stmt *statement;
NSLog(@"could not prepare statement: %s\n", sqlite3_errmsg(_database));
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
DLog(@"row");
int uniqueId = sqlite3_column_int(statement, 0);
}
sqlite3_finalize(statement);
DLog(@"sqliteStep");
} else {
DLog(@"statement Error %d", sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil));
}
" row或sqliteStep"的日志永远不会开火。
答案 0 :(得分:2)
您的else
声明不应再次致电sqlite3_prepare_v2
,而应该:
DLog(@"prepare error: %s", sqlite3_errmsg(_database));
此错误消息报告的内容是什么?
注意:在致电sqlite3_errmsg
之前,您已登录sqlite3_prepare_v2
。当然,这将报告没有错误,因为可能还没有发生错误。在else
子句中执行此日志记录,您知道已调用sqlite3_prepare_v2
(a);但是(b)没有返回SQLITE_OK
。并且在sqlite3_prepare_v2
失败和您记录错误消息的位置之间不要调用任何SQLite函数。
最常见的问题是它报告没有这样的表格。如果这就是您所看到的,在这种情况下可能是因为未能将数据库包含在应用程序包中(请参阅"复制捆绑资源""构建部分阶段"目标设置部分)。
或者,如果它说某些关于数据库的内容很忙,那么如果您的数据库打开调用和数据库关闭调用不匹配(如此代码示例中所示),则会发生这种情况。
答案 1 :(得分:1)
请确保在模拟器中运行应用程序时,未使用任何sqlite数据库浏览器打开sqlite数据库。 它发生在我身上,我在sqlite浏览器中打开了我的sqlite数据库来测试我的查询,当我从模拟器运行应用程序时,它没有在db中更新任何内容。
答案 2 :(得分:0)
问题是我的文件是sqlite扩展名,但代码指定了sqlite3的扩展名。我认为这两个是同义词,但他们不是