sqlite3_prepare_v2!= SQLITE_OK

时间:2013-07-09 05:05:49

标签: iphone ios

我想问下面我的功能。 当我调用此函数时,它打印不可用。 你能帮帮我吗?

    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;
}

2 个答案:

答案 0 :(得分:7)

有一些原因导致sqlite3_prepare_v2!= SQLITE_OK:

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

  2. 查询语句错误。

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

  4. 您可以通过在else中添加以下内容来使用错误语句找到确切的问题:

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

答案 1 :(得分:1)

sqlite3 open。 “如果文件名是空字符串,则将创建一个私有的临时磁盘数据库。一旦数据库连接关闭,该私有数据库将自动删除。”

因此,如果数据库未复制到Documents目录中,则sqlite3_open将返回SQLITE_OK。您应该将数据复制到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];

}