sqlite3_prepare_v2!= SQLITE_OK

我想问下我的function。 当我调用这个函数时,它打印不可用。 请问你能帮帮我吗??

static sqlite3 *database = nil; static sqlite3_stmt *statement = nil; - (BOOL) findNews:(NSString *)caption{ const char *dbpath = [databasePath UTF8String]; if (sqlite3_open(dbpath, &database) == SQLITE_OK) { NSLog(@"CAPTION ID : %@", caption); NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM dbase WHERE CONTENT_ID = \"%@\"", caption]; const char *query_stmt = [querySQL UTF8String]; if (sqlite3_prepare_v2(database, query_stmt, -1, &statement, NULL) == SQLITE_OK) { if (sqlite3_step(statement) == SQLITE_ROW) { return YES; } else{ return NO; } sqlite3_reset(statement); }else{ NSLog(@"NOT AVAILABLE"); } } return nil; } 

有一些原因是由于sqlite3_prepare_v2!= SQLITE_OK:

  1. 该表可能不会出现在数据库中。

  2. 错误的查询语句。

  3. 错误的列名到查询语句中。

你可以使用错误语句find确切的问题,方法如下:

  NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)) 

sqlite3 打开 。 “如果文件名是一个空string,那么就会创build一个私有的临时磁盘数据库,一旦数据库连接closures,这个私有数据库就会自动删除。

所以sqlite3_open将返回SQLITE_OK,如果数据库没有复制到Documents目录下。 您应该将数据复制到Bundle中并将此数据库复制到Documents目录。

 -(void) checkAndCreateDatabase{ BOOL success; NSFileManager *fileManager = [NSFileManager defaultManager]; success = [fileManager fileExistsAtPath:databasePath]; if(success) return; NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"]; [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; }