Falta de tabla en SQLite con la versión específica de HTC DESIRE HD

Mi aplicación tiene una base de datos SQLite en la carpeta de activos. Cuando el usuario inicia mi aplicación, se crea la base de datos y también las tablas.

Esto funciona bien con una gran cantidad de dispositivos (Nexus One, Htc Magic, SGS, X10 … e incluso Htc Desire HD v2.2). Mi aplicación funciona con todas las versiones de Android (probado en mi dispositivo (1.6, 2.2, 2.2.1 Htc Magic) y en el emulador (v1.5 hasta v2.3).

Tengo un problema con HTC DESIRE HD v2.2.1 1.72.405.3.

El logcat:

Android.database.sqlite.SQLiteException: no such tabla: LISTE:, while compilando: select _id de LISTE en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2833) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java: 2854) en android.app.ActivityThread.access $ 2300 (ActivityThread.java:136) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2179) en android.os.Handler.dispatchMessage (Handler.java:99) En android.os.Looper.loop (Looper.java:143) en android.app.ActivityThread.main (ActivityThread.java:5068) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect .Method.invoke (Method.java:521) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616 ) En dalvik.system.NativeStart.main (Método nativo) Causado por: android.database.sqlite.SQLiteException: no hay tal tabla: LISTE:, mientras compila: select _id de LISTE en android.database.sqli Te.SQLiteCompiledSql.native_compile (Método nativo) en android.database.sqlite.SQLiteCompiledSql.compile (SQLiteCompiledSql.java:91) en android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64) en android.database.sqlite.SQLiteProgram (SQLiteProgram.java:80) en android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:46) en android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:53) en android.database.sqlite.SQLiteDatabase. RawQueryWithFactory (SQLiteDatabase.java:1417) en android.database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1387) … más

Mi aplicación crea la base de datos pero no copia las tablas del archivo de la carpeta de elementos en data\data\packagename\databases\mydatabase .

Mi código:

 public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); if(dbExist){ //do nothing - database already exist }else{ //By calling this method and empty database will be created into the default system path //of your application so we are gonna be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private void copyDataBase() throws IOException{ //Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = DB_PATH + DB_NAME; //Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))!= -1){ if (length > 0){ myOutput.write(buffer, 0, length); } } //Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } 

Creo que la función copydatabase tiene un problema pero no lo veo.

Este código funciona bien con todos los dispositivos excepto el HTC DESIRE HD v2.2.1 1.72.405.3.

¿Qué problemas pueden existir aquí para el HTC Desire con la versión anterior? ¿Cómo se puede remediar esto?

Esto es un poco una suposición y implicaría que hay un "error" en esa versión de Android para el Desire HD por lo que puede ser salvajemente fuera.

Me pregunto si esa versión de Android no crea la base de datos donde debe hacer. Está asumiendo que DB_PATH es \ data \ data \ packagename \ databases \ como normalmente sería pero ¿y si no lo es? El resultado sería el siguiente …

  1. this.getReadableDatabase() creará una base de datos vacía en \ some \ incorrect \ path \ mydatabase
  2. El uso de new FileOutputStream(outFileName) simplemente crea un nuevo archivo binario vacío porque lo anterior no creó una base de datos en el lugar que usted espera.
  3. La copia se ha realizado correctamente
  4. Antes de realizar la solicitud SELECT, se solicita el acceso a la base de datos utilizando getReadableDatabase() o getWriteableDatabase() pero ambos abrirán simplemente la base de datos vacía que se creó en el paso 1.

En resumen, el proceso de copia puede haber funcionado correctamente, pero el DB que se está operando está vacío y en un lugar diferente a donde usted lo espera.

Sólo una idea (he visto cosas similares suceder a lo largo de los años).

  • ORMLite Seleccionar campos distintos
  • ¿Hay alguna forma de implementar la búsqueda de texto completo (FTS) en SQlite de la plataforma Android?
  • Alternativas de SQLite para Android
  • android sqlite excepción: java.lang.IllegalArgumentException: columna '_id' no existe
  • Cómo crear tablas anidadas en la base de datos SQLite ?? (androide)
  • Obtener mínimo de la columna de la base de datos SQLite?
  • Cómo limpiar / eliminar base de datos greenDao
  • ¿Qué desencadena SqliteDbOpenHelper onUpgrade ()?
  • SQLIte DROP tabla ROLL volver
  • Android: insertar registro sqlite con la columna AUTOINCREMENT
  • Android SQLite - ¿qué hace SQLiteDatabase.replace () en realidad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.