在我的应用程序中,我在一个循环中多次打开数据库然后再次打开数据库,它将不会执行if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK)
此语句,因此我的应用程序无法工作....
-(NSString *)getDBPath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"BasicGreetings.sqlite"];
}
-(void) fillimage:(NSInteger)imgno
{
testAppDelegate *appDelg = (testAppDelegate *)[[UIApplication sharedApplication]delegate];
sqlite3 *database= nil;
if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK)
{
const char *sql = "select setflag from Tblsetflag where imgNo = ?";
sqlite3_stmt *selectStmt = nil;
if (sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) == SQLITE_OK)
{
sqlite3_bind_int(selectStmt, 1,imgno);
while (sqlite3_step(selectStmt) == SQLITE_ROW)
{
appDelg.a = sqlite3_column_int(selectStmt, 0);
NSLog(@"%d",appDelg.a);
}
}
}
sqlite3_close(database);
}
答案 0 :(得分:3)
你可以将代码发布到getDBPath,我怀疑它找不到文件...检查从该方法返回的值(在模拟器中运行)并浏览Finder中的模拟器文档目录并验证文件是否存在
答案 1 :(得分:1)
不要在-fillimage:
方法的每次传递中打开和关闭数据库。你真的应该在你的应用程序开始时(或者当你的应用程序从后台运行时)打开它,并在你的应用程序退出或进入后台时关闭它。
您也永远不会完成准备好的陈述,这可能会导致sqlite3_close()
失败。同样,您可能希望创建一个预准备语句,然后在每次运行该方法时重置它,并在SQLite数据库关闭之前完成它。