sqlite3_step在loadView期间返回代码21

时间:2010-10-16 10:47:54

标签: iphone objective-c sqlite

尝试使用sqlite,我想用数据库中的数据初始化列表视图。我的来源看起来像这样:

-(void) initTheList {
sqlite3 *db;
int rows = 0;

const char* dbFilePathUTF8 = [searchTermDBLocation UTF8String];
int dbrc = sqlite3_open( dbFilePathUTF8, &db );

// count
if (dbrc) {
    NSLog( @"Could not open the DB" );
} else {
    NSString *queryStatementNS = @"select count(*) from article";
    const char* queryStatement = [queryStatementNS UTF8String];

    sqlite3_stmt *dbps;
    dbrc = sqlite3_prepare_v2(db, queryStatement, -1, &dbps, NULL);

    if (sqlite3_step(dbps) == SQLITE_ROW) {
        rows = sqlite3_column_int(dbps, 0);
    } else {
        NSLog(@"SQL step failed code: %d", sqlite3_step(dbps));
        NSLog(@"Attempted Query: %@", queryStatementNS);
    }

    [queryStatementNS release];
}

if (rows > 1000) { ... } else { ... };
...

实际上我认为在加载视图后只调用一次代码会很好。所以我将数组的初始化和方法调用添加到:

- (void)loadView {
   [super loadView];
   tableData = [[NSMutableArray alloc] initWithObjects:nil];
   [self initTheList];
}

然而,这样做,sqlite3_step返回x15(SQLITE_MISUSE 21 / *库使用不正确* /)。如果我将代码放在numberOfRowsInSection方法中调用方法,则调用正常。

有人可以给我一个提示,在那里我可以了解更多关于生命周期和sqlite数据库的关系吗?令我惊讶的是,我可以打开数据库,但读取失败,而放在一个明显在稍后调用的方法中的相同代码工作正常。

2 个答案:

答案 0 :(得分:4)

我自己遇到了错误代码21问题(“库使用不当。”)我在Web上找不到任何有用的答案,我只是准备得出结论SQLite3库中有一些错误在XCode中。然后,最后,我发现了我的问题:我的SQL中的一个微妙的拼写错误。

错误发生在INSERT OR REPLACE语句中。但是那个特定的陈述本身没有拼写错误,所以我找不到最长时间出错的地方。正在创建数据库文件,因此我在其上运行了(Unix)字符串命令,并发现我在表创建过程中在其中一个字段名称中创建了一个拼写错误。该表创建正常,但错误的字段名称。当我进行INSERT或REPLACE时,我使用的是正确的字段名称。啊!不匹配导致错误。

我不知道这是不是你的问题;但是在创建SQL语句时很容易弄错,并且它们并不总是很容易被追踪(正如我今天下午向自己展示的那样)。如果我是你,我会仔细检查你的每一个陈述。

希望这有帮助!

答案 1 :(得分:1)

今天我发现,如果准备好的语句指针恰好为NULL(零),则sqlite3_step()返回错误21。