Excepción de SQLite: SQLite ocupado

¿Alguien puede proporcionar alguna entrada sobre este error? Estoy tratando de insertar en la tabla usando Objective C.

Mientras hago esto, obtengo un error SQLite ocupado. ¿Por qué está pasando esto?

Si lo hago bien, “ocupado” significa que no puede obtener un candado. Parece que algún otro proceso (o hilo, etc.) tiene un locking en una base de datos.

Bloqueo de archivos y concurrencia en SQLite versión 3

Si obtienes como resultado al invocar una función sqlite3 el código de error SQLITE_BUSY, esto significa lo observado por drdaeman que el db ha sido bloqueado por el mismo proceso o por un hilo dentro de tu proceso.

La forma adecuada de tratar con esta situación es probar la operación en un bucle, y si el código de retorno todavía es SQLITE_BUSY, esperar un tiempo (usted decide el valor de tiempo de espera) y luego volver a intentar la operación en la siguiente iteración del bucle.

Por ejemplo, el siguiente fragmento de código se toma del contenedor de Objective C FMDB ( http://code.google.com/p/flycode/source/browse/trunk/fmdb ) muestra cómo preparar una statement para una consulta teniendo en cuenta que algunas operaciones pueden devolver SQLITE_BUSY:

int numberOfRetries = 0; BOOL retry = NO; if (!pStmt) { do { retry = NO; rc = sqlite3_prepare(db, [sql UTF8String], -1, &pStmt, 0); if (SQLITE_BUSY == rc) { retry = YES; usleep(20); if (busyRetryTimeout && (numberOfRetries++ > busyRetryTimeout)) { NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [self databasePath]); NSLog(@"Database busy"); sqlite3_finalize(pStmt); [self setInUse:NO]; return nil; } } else if (SQLITE_OK != rc) { if (logsErrors) { NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); NSLog(@"DB Query: %@", sql); if (crashOnErrors) { NSAssert2(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); } } sqlite3_finalize(pStmt); [self setInUse:NO]; return nil; } } while (retry); } 

Por cierto, si necesita acceder a sqlite, FMDB es muy útil y mucho más fácil de usar con respecto al acceso directo a través de las C API nativas.

Tuve un problema similar con SQLITE_BUSY en los comandos secuenciales INSERT INTO. La primera fila se insertó bien, pero cuando la aplicación intentó insertar una segunda fila, obtuve el estado SQLITE_BUSY. Después de buscar en Google, me enteré de que debe llamar a sqlite3_finalize () en las declaraciones después de ejecutarlas: http://www.sqlite.org/c3ref/finalize.html . Al finalizar mis declaraciones solucioné mi problema.

En mi caso, había olvidado cerrar la base de datos después de usarla. Siguiendo mina fija:

 sqlite3_finalize(statement); sqlite3_close(contactDB); 

FMDB también puede aliviar estos dolores de cabeza fácilmente.

Fue tan simple como ejecutar el símbolo del sistema como administrador para mí. Alternativamente, en UNIX, es posible que pueda usar sudo al iniciar la base de datos.