2011-01-11 9 views
7

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.tabla faltante en SQLite con la versión específica de HTC DESIRE HD

Esto funciona bien con muchos 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 sólo un problema con HTC DESIRE HD v2.2.1 1.72.405.3

El logcat:.

android.database.sqlite.SQLiteException: no hay tal tabla: LISTE:, durante la compilación: seleccionar _id de LISTE al androide. app.ActivityThread.performLaunchActivity (ActivityThread.java:2833) en 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 existe dicha tabla: LISTE:, al compilar: seleccione _id de LISTE en android.database.sqlite.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 androide. database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1387) ... 11 más

Mi solicitud de crear la base de datos pero no copia las tablas del archivo de la carpeta de recursos 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 dada anterior? ¿Cómo puede ser remediada?

+1

Su código publicado se refiere a la creación de una base de datos. Su error se refiere a una declaración ** SELECT ** de una tabla dentro de su base de datos. –

+0

Sí, mi error se refiere a una instrucción SELECT porque mi base de datos se crea cuando el usuario realiza su primera solicitud sql. Se creó la base de datos, pero no la tabla LISTE por ejemplo, por lo que el error SELECT – William

Respuesta

0

Esto es un poco de conjetura e implicaría que hay un 'error' en esa versión de Android para el Desire HD así que puedo estar locamente afuera.

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

  1. this.getReadableDatabase() crearía una base de datos vacía en \ alguna \ \ ruta incorrecta \ mydatabase
  2. Usando new FileOutputStream(outFileName) simplemente crea un nuevo archivo binario vacío porque el anterior no lo hicieron cree una base de datos en el lugar que espera.
  3. La copia pasa con éxito
  4. Antes de realizar la solicitud SELECT, se solicita el acceso a la base de datos utilizando getReadableDatabase() o getWriteableDatabase() pero ambos de los que simplemente va a abrir la base de datos vacía que se creó en el paso 1.

En resumen, es posible que el proceso de copia haya funcionado correctamente, pero la base de datos que está siendo operada está vacía y en un lugar diferente al que usted espera.

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

+2

Hola, Encontré una solución gracias a un usuario de mi aplicación. Aquí la solución: [http://www.anddev.org/networking-database-problems-f29/missing-table-in-sqlite-with-specific-version-of-desire -hd-t50364.html] [1] [1]: http://www.anddev.org/networking-database-problems-f29/missing-table-in-sqlite-with-specific-version-of- desire-hd-t50364.html – William

+0

Esto no funciona para mí. –

Cuestiones relacionadas