2010-10-14 16 views
8

Tengo un problema con una nueva aplicación en el SDK de iPhone usando SQLite como back-end de DB.imagen de disco de la base de datos sqlite malformada en el SDK de iPhone

Ocasionalmente, mi aplicación dejará de cargar datos en mi UITableViews y después de descargar la base de datos del dispositivo a través del Organizador, puedo acceder a la base de datos SQLite mediante la línea de comandos. Puedo consultar bien ciertas tablas pero no otras sin obtener un error "Error de SQL: la imagen de disco de la base de datos está mal formada". Ver una sesión de SQLite a continuación:

SQLite version 3.6.17 
    Enter ".help" for instructions 
    Enter SQL statements terminated with a ";" 
    sqlite> select * from user; 
    1|[email protected]|cpjolicoeur||4d055e38bb1d3758|image/gif|cartoonme_avatar.gif||Craig|Jolicoeur|1|1 
    sqlite> select * from item; 
    SQL error: database disk image is malformed 
    sqlite> 

En este ejemplo, mi tabla de usuario funciona bien, pero mi mesa elemento está mal formado, que se corresponde con lo que estoy viendo en mi aplicación en los artículos dont carga. La aplicación no falla, los datos simplemente no se cargan debido a este error mal formado.

¿Alguna idea de por qué sucede esto? Mi único pensamiento es que tal vez la base de datos está siendo corrompida porque estoy escribiendo en la base de datos SQLite a través de un hilo de fondo dentro de la aplicación. Descargo datos de un servidor web a través de NSOperationQueue en un hilo de fondo y actualizo el DB de SQLite con los datos descargados. Escribir un DB en el hilo de fondo (mientras se lee potencialmente del hilo principal) corrompe el DB, o es algo más?

Respuesta

5

¡Tiene que tener mucho cuidado con los subprocesos de fondo que acceden a la base de datos durante la depuración! Esto se debe a que cuando el depurador detiene el procesamiento (como en un punto de interrupción) todos los hilos están en pausa, incluidos los hilos que pueden estar en medio de una llamada a la base de datos, entre una base de datos "abierta" y una base de datos "cerrada".

Si se detiene en un punto de interrupción y hace clic en la señal de alto en Xcode, su aplicación se cierra inmediatamente. Esto a menudo causa errores como el que vio o el error de "base de datos corruptos".

Realmente no hay ninguna solución (porque no hay forma de modificar el comportamiento de "detener tareas", pero he desarrollado algunas técnicas para mitigarlo: 1. Agregue código para detectar la aplicación que ingresa al fondo y haga que sus operaciones de db se detengan con gracia. 2. Nunca use la señal de alto para detener el proceso durante la depuración. En cambio, cuando termine con un punto de interrupción, presione el botón de inicio en el simulador o dispositivo (que debe activar el código que agregó en el paso 1), espere a la aplicación en segundo plano, ENTONCES puede detener la ejecución.

0

Depende de cómo se compile SQLite, puede o no ser seguro para subprocesos. Si está utilizando el incorporado, es posible que no tenga las opciones de tiempo de compilación que está buscando.

Para nuestra aplicación, tuvimos que hacer rodar nuestro propio SQLite para agregar la búsqueda de texto completo. Eche un vistazo al this page.

5

En mi caso, esto tenía que ver con iOS 7: En iOS 7 Core Data ahora usa el modo diario SQLite WAL que escribe datos en un archivo .db-wal en lugar de directamente al archivo .db. En mi aplicación, copiaba un archivo .db preparado en Library/Application Support durante una actualización de la aplicación. El problema era que un antiguo archivo .db-wal todavía estaba en ese directorio y solo reemplacé el archivo .db. De esa forma, terminé con un archivo .db que no estaba sincronizado con el antiguo archivo .db-wal.

Hay dos soluciones a este problema:

  1. Asegúrese de que el .db, .db-wal y .db-shm archivos se eliminan antes de copiar el nuevo archivo de .db en su lugar.
  2. Volver al comportamiento de edad pre-iOS 7, así: https://stackoverflow.com/a/18870738/171933
+0

Eliminación de los archivos y Wal SHM totalmente lo hizo por mí! Gracias –

Cuestiones relacionadas