iOS 응용 프로그램에서 SQLite로 만든 색인을 삭제하는 데 문제가 있습니다. 나는 fmdb을 사용하고 있습니다.iOS에서 fmbd로 SQLite 색인을 삭제하는 데 SQLITE_LOCKED가 발생하지 않습니다.
인덱스를 삭제하려고 시도하면 sqlite3_step
은 항상 SQLITE_LOCKED
을 반환합니다. 결과적으로 fmdb는 계속해서 drop 문 (매번 sqlite3_step
이 SQLITE_LOCKED
을 반환 함)을 재 시도하려고하는 무한 루프에 걸리며 명령문은 성공하지 못합니다.
내가 아는 한, drop 문이 작동하기 바로 전에 데이터베이스와 문을 만지는 다른 프로세스는 문제없이 존재합니다. 내가 뭘 놓치고 있니?
[db open];
/* ... */
[db executeUpdate:@"DROP INDEX IF EXISTS bookmark_hash_idx;"];
[db close];
db
내 문서 디렉토리에 SQLite는 데이터베이스에 대한 포인터입니다 :
여기에 거의 실패 년대 코드를 그대로 복사합니다. 그 유용 경우
여기, fmdb에서 관련 코드입니다 :
do {
rc = sqlite3_step(pStmt);
retry = NO;
if (SQLITE_BUSY == rc || SQLITE_LOCKED == 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;
if (SQLITE_LOCKED == rc) {
rc = sqlite3_reset(pStmt);
if (rc != SQLITE_LOCKED) {
NSLog(@"Unexpected result from sqlite3_reset (%d) eu", rc);
}
}
/* ... */
}
/* ... */
} while (retry);
앱 번들에 파일을 쓰려고하지 않습니다. 그렇습니까? –
'sqlite3_step' 대신'sqlite3_exec'을 사용하여 스키마를 업데이트 해보십시오. – rmaddy
Nope. 내 문서 디렉토리에 있어요. –