2010-08-25 9 views
23

Mi aplicación utiliza un controlador de excepciones no detectadas que me envía el rastreo de la pila cuando falla la aplicación. A menudo recibo este informe de usuarios aleatorios.Excepción aleatoria android.database.sqlite.SQLiteException: no se puede abrir el archivo de base de datos

No puedo replicarlo, la apertura de la base de datos siempre tiene éxito en mi caso. Esta no es una base de datos almacenada en una tarjeta SD externa, solo una base de datos abierta con SQLiteOpenHelper(context, "SomeName", null, someVersionCode).

¿Tienes alguna experiencia con esto? ¿Cuáles son las posibilidades que puedo verificar antes de abrir la base de datos?

Gracias!

android.database.sqlite.SQLiteException: unable to open database file 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
    at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:4363) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteException: unable to open database file 
    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
    at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1698) 
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:739) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:761) 
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:754) 
    at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:476) 
    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
+0

asegúrese de que su nombre de la base de datos dentro de la carpeta activos y declarar nombre de la base de la clase de ayuda es la base de datos misma. y compruebe la ruta de su base de datos con el nombre de la base de datos mientras intenta copiar la base de datos. pon tu código aquí para que otros puedan verificar tu clase de ayuda de la base de datos. – Maulik

+0

El error muestra que la base de datos no pudo abrir la base de datos, es decir, puede no haber establecido la condición "SQLiteDatabase.OPEN_READWRITE" en el método de base de datos abierta y también cambiar las propiedades del permiso de escritura de lectura de cambio de archivo de base de datos. asegúrate de que esté sobre ambos casos. – Maulik

+0

visite este [enlace] (http://stackoverflow.com/questions/4187631/unable-to-open-database-file-when-using-sqliteopenhelper-with-instrumentation) puede ser una ayuda completa para usted – Engineer

Respuesta

2

Uno de los posibles escenarios cuando esto podría suceder - es cuando acceda a su archivo de base de datos desde varios hilos y cuando el archivo está bloqueado por uno de los hilos, mientras que usted está tratando de abrirlo para las modificaciones de otro hilo.

+0

Yo también tengo el mismo problema Guardo mi nota en un db. Cuando inserto una nueva entrada y presiono la tecla 'volver' o 'inicio' para regresar a la pantalla de inicio. Después de eso trato de utilizar el agente de copia de seguridad para restaurar mi nota, siempre recibí el mismo error (código de error 14). Si elimino el proceso de memo, mi agente de copia de seguridad de memo puede funcionar normalmente. Creo que el db se abre con otro hilo. ¿Cómo puedo cerrarlo? ¿Alguien podría proporcionar una solución? –

5

tengo el mismo error después de actualizar mi firmware de Android. la base de datos fue creada por el firmware anterior y, por lo tanto, no fue posible abrirla con el nuevo firmware. usuarios podrían resolver este error desinstalando y reinstalando su aplicación.

0

@yuku

Este tipo de problema que he enfrentado, que han resuelto este problema al igual que de esa manera.

  1. Necesitamos comprobar si Antiguo base de datos es igual que Nueva base de datos, si algo ha cambiado en la nueva base de datos que el tiempo que necesitamos eliminar base de datos antigua e instalar nueva base de datos o alterar la tabla según nueva base de datos

  2. La segunda opción es fácil sólo desinstalación su antigua aplicación y de instalar nueva aplicación

Espero que esto funcione para usted .. !!!

0

Para cualquier aplicación de base de datos, creo la base de datos sqlite primero con el complemento Sqlite Manager de Firefox y lo tomo en la carpeta/res/raw. Luego, en mi código, verifico si la base de datos existe en/data/data para esta aplicación. Si no, copio el archivo db en ese directorio con mi código.

Para su situación, es difícil determinar la razón exacta sin ver cómo ha creado su base de datos y cómo la está utilizando. Puede haber varias razones para obtener esta excepción. Algunos problemas ya mencionados por otros. Quiero mencionar uno. Se puede tratar de abrir la base de datos como éste

SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

Probablemente, he podido probar mejor para ayudar si muestra sus fragmentos de código. Bueno, mis métodos se describen aquí, puedes echar un vistazo si eso ayuda.

Populating SQLite Database

0

me he enfrentado a este problema.

Una de mis aplicaciones se comportaba del mismo modo, porque añadí el código para copiar la base de datos desde activos a la ubicación especificada en la pantalla de inicio (la pantalla que se visualiza cuando se inicia la aplicación y se apaga automáticamente después de unos segundos)

Y lo que estaba sucediendo en algunos casos, esa base de datos no se copiaba en el marco de tiempo especificado y el acceso desde dentro de la aplicación estaba causando excepciones.

Lo que hice,

que acabo de escribir el código para copiar la base de datos de subproceso de fondo y mostrar la pantalla de bienvenida al usuario hasta que la base de datos de tiempo no se copia sólo después de que muestran la siguiente pantalla.

Podría haber otra solución, si la aplicación se está instalando en una versión anterior, escriba el código para copiar los datos guardados de la versión anterior de la aplicación a nueva vesrion si es necesaria la prevención de datos y la nueva versión contiene modelos diferentes a el de la versión anterior.

2

puede haber si su aplicación abre la base de datos desde varios subprocesos al mismo tiempo que puede ser el motivo de esta excepción.

intente con el método sincronizado para abrir la base de datos. El método sincronizado no permitirá que la base de datos se abra desde varios subprocesos al mismo tiempo. pongo a continuación código en su dbHelper

private synchronized SQLiteDatabase getWritableDB() { 
     //get your database and return it from this method. 
} 

y llame a estos métodos cuando su están recibiendo db. Espero que ayude.

0

aplicación Reinstalar y tratar de usar la base de datos de bloque sincronizado CUAJADA operaciones :)

Cuestiones relacionadas