为什么我收到sqlite3错误?

时间:2009-04-28 12:44:28

标签: iphone objective-c sqlite

我正在尝试在方法中重用我的应用程序中的sqlite语句。这是相关代码

if(getsets_statement == nil){
    const char *sql = "SELECT DISTINCT num,roll FROM mytable WHERE cls like ? and divname like ?";
    if(sqlite3_prepare_v2(database, sql, -1, &getsets_statement, NULL) != SQLITE_OK){
        NSAssert1(0, @"Error: Failed to prepare stmt with message '%s'", sqlite3_errmsg(database));
    }       
}

sqlite3_bind_text(getsets_statement, 1, [cls UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(getsets_statement, 2, [divname UTF8String], -1, SQLITE_TRANSIENT);

while(sqlite3_step(getsets_statement) == SQLITE_ROW){

    setNumber= sqlite3_column_int(getsets_statement, 0);        

    roll = sqlite3_column_int(getsets_statement, 1);

    [numArr addObject:[NSNumber numberWithInt:setNumber]];
    [rollArr addObject:[NSNumber numberWithInt:roll]];
}

sqlite3_reset(getsets_statement);

该语句在第一次调用时完美执行。但是下次我调用这个方法时,我得到一个sqlite3errordivnamecls的值存在(执行NSLog并已检查)但我不明白为什么会收到此错误。我在第一个bind_text语句中收到错误。

这是在gdb控制台

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) where
#0  0x9041857f in sqlite3Error ()
#1  0x9041acea in vdbeUnbind ()
#2  0x9041b2c8 in bindText ()

任何帮助?

2 个答案:

答案 0 :(得分:2)

确保没有其他事实上是问题(数据库是否在其他地方被关闭?getsets_statement是否指向同一个对象?它已经完成了吗?)。然后尝试使用NULL或SQLITE___STATIC而不是SQLITE_TRANSIENT。由于[NSString UTF8String]返回不需要释放的数据(由你),它显然不需要析构函数,它将保持有效,直到你的函数退出,此时你已经完成了运行声明无论如何。

答案 1 :(得分:0)

我认为在尝试重用之前,您需要在准备好的语句上调用sqlite3_resetsqlite3_clear_bindings。此外,您应该检查您的退货代码。