【问题标题】:sqlite3 DELETE problem "Library Routine Called Out Of Sequence"sqlite3 DELETE问题“Library Routine Called Out Of Sequence”
【发布时间】:2011-02-17 11:32:22
【问题描述】:

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

+ (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);
}

【问题讨论】:

    标签: objective-c sqlite


    【解决方案1】:

    我解决了这个问题,但我不知道为什么。它不想让我在 for 循环中执行删除操作。我将删除放在它自己的方法中,并从 for 循环中调用它,效果很好。很奇怪。

    【讨论】:

      【解决方案2】:

      我刚刚遇到这个错误信息,原来是两个线程同时执行查询。只需重新排列代码就足以改变时间,让它消失。

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

      【讨论】:

        【解决方案3】:

        我刚刚遇到过类似的。

        原来我忘记为 DELETE 重置准备好的绑定语句,第二次调用时会遇到麻烦。

        对于这个问题的情况,也许应该将sqlite3_finalize 替换为splite3_reset 以在循环块中重用。并且该语句应仅在循环之后在调用 sqlite3_close 之前完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          • 1970-01-01
          • 1970-01-01
          • 2014-08-17
          • 1970-01-01
          • 2019-04-28
          • 1970-01-01
          相关资源
          最近更新 更多