SQLite devolvió un código de error de 14

Intento copiar una base de datos existente desde mi carpeta de activos y ejecutar algunas operaciones en ella. Todo funciona bien, pero obtuve el siguiente error en los archivos de registro de mi emulador:

sqlite returned: error code = 14, msg = cannot open file at source line 25467 09-06 11:23:41.844: INFO/Database(22560): sqlite returned: error code = 14, msg = cannot open file at source line 25467 09-06 11:23:41.885: ERROR/Database(22560): sqlite3_open_v2("/data/data/com.dhani.Lazy/databases/LazyDB.sqlite", &handle, 1, NULL) failed 09-06 11:23:41.885: WARN/System.err(22560): android.database.sqlite.SQLiteException: unable to open database file 09-06 11:23:41.894: WARN/System.err(22560): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 09-06 11:23:41.904: WARN/System.err(22560): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1849) 09-06 11:23:41.914: WARN/System.err(22560): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820) 09-06 11:23:41.914: WARN/System.err(22560): at com.dharani.LazyApple.Database.DataBaseHelper.checkDataBase(DataBaseHelper.java:72) 09-06 11:23:41.914: WARN/System.err(22560): at com.dharani.LazyApple.Database.DataBaseHelper.createDataBase(DataBaseHelper.java:47) 09-06 11:23:41.914: WARN/System.err(22560): at com.dharani.LazyApple.Database.DataBaseHelper.Login(DataBaseHelper.java:166) 09-06 11:23:41.914: WARN/System.err(22560): at com.dharani.LazyApple.Views.LoginView$1.onClick(LoginView.java:63) 09-06 11:23:41.934: WARN/System.err(22560): at android.view.View.performClick(View.java:2485) 09-06 11:23:41.934: WARN/System.err(22560): at android.view.View$PerformClick.run(View.java:9080) 09-06 11:23:41.944: WARN/System.err(22560): at android.os.Handler.handleCallback(Handler.java:587) 09-06 11:23:41.944: WARN/System.err(22560): at android.os.Handler.dispatchMessage(Handler.java:92) 09-06 11:23:41.944: WARN/System.err(22560): at android.os.Looper.loop(Looper.java:123) 09-06 11:23:41.944: WARN/System.err(22560): at android.app.ActivityThread.main(ActivityThread.java:3683) 09-06 11:23:41.964: WARN/System.err(22560): at java.lang.reflect.Method.invokeNative(Native Method) 09-06 11:23:41.964: WARN/System.err(22560): at java.lang.reflect.Method.invoke(Method.java:507) 09-06 11:23:41.964: WARN/System.err(22560): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 09-06 11:23:41.964: WARN/System.err(22560): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 09-06 11:23:41.964: WARN/System.err(22560): at dalvik.system.NativeStart.main(Native Method) 

¿Alguna sugerencia sobre cómo resolver este problema?

He visto este error si está utilizando sharedUserId en su manifiesto. Si cambia el sharedUserId de una aplicación y vuelve a instalar la aplicación, no tiene la propiedad requerida para escribir en la base de datos SQLite.

Esto puede ser un poco tarde, pero espero que esto ayude a cualquiera que tenga este problema (ya que no puedo encontrar una solución definitiva).

Creo que sé el motivo de esta causa (al menos en mi caso). Si busca en el DDMS -> Explorador de archivos , se daría cuenta de que la Carpeta de base de datos (/ data / data // databases /) no existe, por lo que la aplicación no puede crear el archivo de base de datos en esa carpeta que no existe. Si puede crear una carpeta de bases de datos de alguna manera, puede evitar este problema.

Como soy flojo, acabo de utilizar la carpeta / data / data // files / cuando estoy en modo Emulador. Puede obtener los archivos dir usando esto:

 context.getFilesDir().getPath() 

Esto funcionó maravillosamente para mí en el Emulador.

Espero que esto ayude a alguien.

En caso de que quiera ver algún código:

 String dbFilename = "example.db"; try { File databaseFile = getDatabasePath(dbFilename); SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); } catch (Exception e) { String databasePath = getFilesDir().getPath() + "/" + dbFilename; File databaseFile = new File(databasePath); _db = SQLiteDatabase.openOrCreateDatabase(databaseFile); } 

EDITAR: Intenté iniciar sesión en Facebook (mi aplicación tiene integración FB) en el emulador y la carpeta / databases apareció después de eso (y persistió). No estoy seguro de lo que sucedió, pero es posible crear esa carpeta de alguna manera. Algo para otro experto por aquí para arrojar luz sobre.

Hoy este problema me costó 3 horas. Lo que probé:

  • Reescribiendo el código de la base de datos de copia.
  • Eliminar la aplicación del emulador / dispositivo
  • Wiping emulator (s)
  • Eclipse de limpieza
  • Cambio de permisos de archivos

Resolví el problema copiando el código de una cuenta compartida de Dropbox en otra ubicación y refacturando el código en el Manifiesto de Android y en los archivos Java con otro nombre de paquete.

La aplicación funciona maravillosamente ahora.

Yo tuve el mismo problema.

Lo que lo resolvió fue reemplazar

 private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/"; 

con

 String myPath = myContext.getFilesDir().getAbsolutePath().replace("files", "databases")+File.separator + DB_NAME; 

Tenía el mismo código de error en logcat:

sqlite returned: error code = 14, msg = cannot open file at source line

La aplicación funcionaría bien (de hecho, no noté ningún problema hasta que miré Logcat). Logcat me informó de este error, así que pensé que sería mejor resolverlo ahora.

¡Resulta que si edité el archivo de manifiesto eliminó el error! Dentro de mi manifiesto, escribí la versión incorrecta min SDK. Descubrí esto porque dentro del archivo de manifiesto había un indicador de exclamación a lo largo de la columna izquierda del código que me informaba de mi error.

Para ser exhaustivo, le recomiendo que se asegure de que todos los errores / exclamaciones se hayan solucionado para que al menos pueda descartarlos.

¡Parece que este error (y muchos más en eclipse) puede ocurrir dependiendo de una gran cantidad de factores! Oh las alegrías!

O bien, otra solución fácil que funcionó para mí es la siguiente:

  1. En la opción de configuración del emulador, haga clic en Aplicación
  2. Ve a Administrar aplicaciones
  3. Encuentra tu aplicación y haz clic en Desinstalar
  4. A continuación, ejecute su aplicación nuevamente desde el Eclipse.

Mi razón era diferente: accedí a la versión en línea de la aplicación, que creó la base de datos. La aplicación PhoneGap no pudo acceder al archivo creado por la aplicación diferente. Borrar el caché del navegador resolvió mi problema.

El enigma se resuelve, prueba en el emulador sin la base de datos y los marca incorrectamente, por lo que primero debe crear la base de datos

  InputStream myInput = myContext.getAssets().open(DB_NAME); //Destination folder (where we created the DB empty) String outFileName = DB_PATH + DB_NAME; //We opened it BBDD Vacia as OutputStream OutputStream myOutput = new FileOutputStream(outFileName); //Transfers Bytes between input and output Stream byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } //Close the open files myOutput.flush(); myOutput.close(); myInput.close(); } 

Después de eso, haz tus operaciones. ¡Buena suerte!

Pude resolver esto al darme cuenta de que la documentación es un poco engañosa. Debe tener un nombre de archivo para su activo comprimido que esté relacionado con el nombre de su base de datos. Por ejemplo, si su base de datos se llama someData.db , su archivo zip debe ser someData.zip .

Además, parece que hay un poco mejor de diagnóstico si intenta abrir un db grabable. Lo hice en el constructor, de la siguiente manera, que fue lo que finalmente me ayudó a encontrar la solución.

 SQLiteDatabase db=getWritableDatabase(); db.close(); 

Asegúrese de cerrar todas las instancias de cursor y db. Tuve este error debido a que hice varias inserciones y actualizaciones y no cerré los cursores, causando fugas en el cursor e incapaz de abrir el archivo db.