0

我想在下面询问我的功能。当我调用此函数时,它会打印 NOT AVAILABLE。请问你能帮帮我吗??

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

2 回答 2

7

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

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

  2. 错误的查询语句。

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

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

 NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database))
于 2013-07-09T05:17:59.753 回答
1

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

因此,如果数据库没有复制到 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];

}
于 2013-07-09T05:22:49.910 回答