2009-03-11 20 views
26

Comencé a notar un comportamiento extraño con mis consultas SQLite para mi aplicación de iPhone. Cada vez que ejecuto una instrucción "INSERT", se crea un archivo de diario junto a mi archivo db (el nombre de archivo exacto es "userdata.db-journal").¿Qué causa que se cree un archivo de diario en SQLite?

Si entiendo los documentos correctamente, SQLite utiliza este archivo de diario para poder deshacerlo en caso de que la operación falle. Pero el archivo permanece allí después de que se completa la operación.

hago los pasos clásicos para la preparación, la unión y la ejecución de la consulta (no cheques de valores de retorno de simplicidad):

sqlite3 *db = NULL; 
sqlite3_open("userdata.db", &db); 

sqlite3_stmt *insertStmt = NULL; 
const char *query = "INSERT INTO table VALUES(?,?)"; 
sqlite3_prepare_v2(db, query, -1, &insertStmt, NULL); 

sqlite3_bind_int(insertStmt, 1, 0); 
sqlite3_bind_int(insertStmt, 2, 0); 

sqlite3_step(insertStmt); 

sqlite3_reset(insertStmt); 
sqlite3_clear_bindings(insertStmt); 

sqlite3_close(db); 

El archivo de diario se crea después de la función 'sqlite3_step' se llama y se queda allí hasta que cierre el db. ¿Qué debo hacer para que desaparezca?

Respuesta

24

SQLite por defecto crea el archivo de diario en el inicio de una transacción, que es algo bueno. Normalmente elimina el archivo al confirmar.

Puede cambiar este comportamiento para simplemente truncar el archivo (no es necesario crear/eliminar) o para ponerlo en cero, mediante un comando PRAGMA sql. No todas las opciones pueden ser compatibles con su versión de SQLite.

PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF 

operaciones de escritura normalmente no se completan hasta que confirme, que se implementa mediante el truncamiento, eliminar o invalidar la revista.

Si este comportamiento es nuevo, no tengo ninguna explicación de por qué podría haber cambiado, aparte de tal vez una actualización de SQLite cambió el comportamiento predeterminado, o se ha vuelto más sofisticado al no volver a abrir el diario para cada transacción.

2

¿Por qué quieres?

El archivo de diario realiza un seguimiento de cada transacción a la base de datos; que desea que cuelgue alrededor hasta que cierre la base de datos, por lo que el estado de DB puede ser reconstruida después de un accidente, incluso si los búferes de escritura no tienen enrojecida etc.

2

Como dijo Joe, el diario se crea cuando se inicia una transacción y SQLlite crea uno cuando inicia una declaración.

para limpiar esa revista y asegúrese de que la declaración se ha comprometido a la utilización db:

sqlite3_finalize(insertStmt); 

Antes de su cierre.

El archivo .journal desaparecerá y todos sus datos serán buenos y seguros en su base de datos.

Espero que esto ayude.

chris.

Cuestiones relacionadas