sqlite3删除问题“库例程被叫出序列”

时间:2010-05-09 23:37:29

标签: objective-c sqlite

这是我的第二个愚蠢的Noob问题。我正在尝试做一个简单的删除,我一直在准备步骤。我已经有其他删除,插入,更新和选择工作。我确信这很简单。感谢您的帮助。

+ (void)flushTodaysWorkouts {

    sqlite3_stmt *statement = nil;

    //open the database
    if (sqlite3_open([[BIUtility getDBPath] UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert(0, @"Failed to opendatabase");
    }

    NSArray *woList = [self todaysScheduledWorkouts];

    for (Workout *wo in woList) { 

        NSInteger woID = wo.woInstanceID;


        if(statement == nil) {
            const char *sql = "DELETE FROM IWORKOUT WHERE WOINSTANCEID = ?";
            if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(database));
        }

        //When binding parameters, index starts from 1 and not zero.
        sqlite3_bind_int(statement, 1, woID);

        if (SQLITE_DONE != sqlite3_step(statement))
            NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(database));


        sqlite3_finalize(statement);
    } 


    if(database) sqlite3_close(database);
}

3 个答案:

答案 0 :(得分:0)

我解决了这个问题,但我不知道为什么。它不想让我在for循环中进行删除。我把删除放在它自己的方法中,并从for循环调用它,它工作得很好。怪异。

答案 1 :(得分:0)

我刚刚遇到此错误消息,结果是两个线程同时执行查询。只需重新排列代码就足以改变时间,以便它可以消失。

添加锁以防止多次访问数据库解决了问题

答案 2 :(得分:0)

我刚遇到类似的一个。

事实证明我忘了为DELETE重置一个准备好的绑定语句,这会在第二次调用时遇到麻烦。

对于此问题中的情况,可能应将sqlite3_finalize替换为splite3_reset以在循环块中重用。并且只有在循环之后才能在调用sqlite3_close之前完成语句。