2011-01-11 2 views
7

Mon application dispose d'une base de données SQLite dans le dossier des ressources. Lorsque l'utilisateur lance mon application, la base de données est créée et les tables aussi.Table manquante dans SQLite avec une version spécifique de HTC DESIRE HD

Cela fonctionne très bien avec beaucoup de périphériques (Nexus One, Htc Magic, SGS, X10 ... et même Htc Desire HD v2.2). Mon application fonctionne avec toutes les versions d'Android (testé sur mon appareil (1.6, 2.2, 2.2.1 Htc magique) et sur l'émulateur (v1,5 jusqu'à v2.3).

J'ai juste un problème avec HTC DESIRE HD v2.2.1 1.72.405.3

Le logcat.

android.database.sqlite.SQLiteException: pas de tableau: LISTE:, lors de la compilation: sélectionnez _id de à Android LISTE. app.ActivityThread.performLaunchActivity (ActivityThread.java:2833) at android.app.ActivityThread .handleLaunchActivity (ActivityThread.java:2854) at android.app.ActivityThread.access $ 2300 (ActivityThread.java:136) à android.app.ActivityThread $ H.handleMessage (ActivityThread.java:2179) at android.os. Handler.dispatchMessage (Handler.java:99) à android.os.Looper.loop (Looper.java:143) à android.app.ActivityThread.main (ActivityThread.java:5068) à java.lang.reflect. Method.invokeNative (méthode native) à java.lang.reflect.Method.invoke (Method.java:521) à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:858) at com .android.internal.os.ZygoteInit.main (ZygoteInit.java:616) à dalvik.system.NativeStart.main (méthode native) Causé par: android.database.sqlite.SQLiteException: aucune table de ce type: LISTE:, lors de la compilation: sélectionnez _id de LISTE at android.database.sqlite.SQLiteCompiledSql.native_compile (méthode native) at android.database.sqlite.SQLiteCompiledSql .compile (SQLiteCompiledSql.java:91) à android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64) à android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80) à android.database.sqlite .SQLiteQuery. (SQLiteQuery.java:46) à android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:53) à android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1417) à androïde. database.sqlite.SQLiteDatabase.rawQuery (SQLiteDatabase.java:1387) ... 11 plus

Ma demande de créer la base de données, mais il ne copie pas les tables du fichier du dossier actif data\data\packagename\databases\mydatabase.

Mon code:

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(); 

} 

Je pense que la fonction copydatabase a un problème, mais je ne vois pas.

Ce code fonctionne correctement avec tous les périphériques sauf le HTC DESIRE HD v2.2.1 1.72.405.3.

Quels sont les problèmes susceptibles d'exister ici pour le HTC Desire avec la version donnée ci-dessus? Comment peut-on y remédier?

+1

Votre code posté concerne la création d'une base de données. Votre erreur concerne une instruction ** SELECT ** d'une table de votre base de données. –

+0

Oui, mon erreur concerne une instruction SELECT car ma base de données est créée lorsque l'utilisateur fait sa première requête SQL. La base de données est créée mais pas la table LISTE par exemple, donc l'erreur d'instruction SELECT – William

Répondre

0

Ceci est un peu une supposition et impliquerait qu'il ya un «bug» dans cette version d'Android pour le Desire HD, donc je peux être sauvagement.

Je me demande si cette version d'Android ne crée pas la base de données où elle devrait faire. Vous supposez que DB_PATH est \ data \ data \ packagename \ databases \ comme il le serait normalement mais que faire si ce n'est pas le cas? Le résultat serait la suivante ...

  1. this.getReadableDatabase() créerait une base de données vide à \ some \ chemin incorrect \ \ mabase
  2. En utilisant new FileOutputStream(outFileName) crée simplement un nouveau fichier binaire vide parce que le fait ci-dessus ne créer une base de données à l'endroit que vous attendez.
  3. La copie se
  4. avec succès
  5. Avant d'effectuer la demande SELECT, l'accès à la base de données est demandée à l'aide soit getReadableDatabase() ou getWriteableDatabase() mais les deux personnes vont tout simplement ouvrir la base de données vide qui a été créé à l'étape 1.

En bref, le processus de copie a peut-être bien fonctionné, mais la base de données en cours de fonctionnement est vide et à un endroit différent de l'endroit où vous l'attendez.

Juste une idée (j'ai vu des choses semblables se produire au cours des années).

+2

Bonjour, J'ai trouvé une solution grâce à un utilisateur de mon application. Voici la solution: [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-avec-specific-version-of- desire-hd-t50364.html – William

+0

Cela ne fonctionne pas pour moi. –

Questions connexes