-1

非常感谢你。

我遇到了一个循环,不知道如何在这里摆脱它。

这是代码:

- (BOOL) next {

int rc;
BOOL retry;
int numberOfRetries = 0;
do {
    retry = NO;

    rc = sqlite3_step(statement.statement);

    if (SQLITE_BUSY == rc) {
        // this will happen if the db is locked, like if we are doing an update or insert.
        // in that case, retry the step... and maybe wait just 10 milliseconds.
        retry = YES;
        usleep(20);

        if ([parentDB busyRetryTimeout] && (numberOfRetries++ > [parentDB busyRetryTimeout])) {

            NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [parentDB databasePath]);
            NSLog(@"Database busy");
            break;
        }
    }
    else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {
        // all is well, let's return.
    }
    else if (SQLITE_ERROR == rc) {
        NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    } 
    else if (SQLITE_MISUSE == rc) {
        // uh oh.
        NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    }
    else {
        // wtf?
        NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([parentDB sqliteHandle]));
        break;
    }

} while (retry);

错误发生在rc = sqlite3_step(statement.statement);

4

2 回答 2

1
  1. 返回什么值sqlite3_step?在你的前面写一个NSLog声明sqlite3_step(并显示numberOfRetries)。你后来暗示它挂在sqlite3_step函数调用上,这似乎不太可能。

  2. 更有可能的是,这个例程被重复调用sqlite3_step(例如,如果数据库很忙并且[parentDB busyRetryTimeout]为 0,这个函数将永远不会结束(或者至少在数据库争用得到解决之前)。这是唯一一个让我跳出来的明显问题,但它需要多种因素的汇合。

  3. 为什么你的数据库很忙?试图在后台队列中使用它?就我个人而言,对于需要后台数据库操作的应用程序,我在GCD队列中为我的数据库操作创建了一个单独的串行队列,因为它是串行的,因此可以确保没有数据库争用。顺便说一句,如果你想摆脱 SQLite 编程的杂草,FMDB是一个很棒的包装器,它可以为你处理所有这些。如果我对第 2 点的猜想是正确的,则需要先解决这个问题,但总的来说,FMDB 简化了对数据库的后台操作。FMDatabaseQueue

于 2012-11-14T00:40:00.460 回答
0

我认为问题在于statement.statement它应该只是rc = sqlite3_step(statement);

我建议在 step 语句之前检查 db,在 prepare 语句本身进行检查。

 rc      = sqlite3_prepare(db, [sql UTF8String], -1, &statement, 0);
于 2012-11-14T04:45:24.783 回答