-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 に答える