2011-08-25 5 views
5

J'ai récemment publié une application sur le marché. De la console des développeurs, il semble que 1-2% de mes utilisateurs ont ce problème. 1-2% est petit mais les gens sont plus enclins à laisser des commentaires quand quelque chose ne fonctionne pas plutôt que quand cela peut avoir un effet négatif sur les téléchargements.SQLiteException - ne se produit que sur certains appareils

Malheureusement, la console des développeurs ne répertorie que la plate-forme en tant que «autre», mais mon application est disponible pour ceux avec SDK 1.6+. Je suis également incapable de recréer ce problème et aucun utilisateur ne m'a contacté directement, je ne peux donc pas obtenir plus d'informations sur les périphériques sur lesquels il échoue.

Voici la pile

android.database.sqlite.SQLiteException: no such table: QUESTIONS: , while compiling: SELECT * FROM QUESTIONS WHERE DIFFICULTY=2 ORDER BY RANDOM() LIMIT 20 
at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46) 
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) 
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1434) 
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1404) 
at com.app.myapp.db.DBHelper.getQuestionSet(DBHelper.java:140) 
at com.app.myapp.SplashActivity.getQuestionSetFromDb(SplashActivity.java:109) 
at com.app.myapp.SplashActivity.onClick(SplashActivity.java:58) 
at android.view.View.performClick(View.java:2421) 
at android.view.View$PerformClick.run(View.java:8867) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:143) 
at android.app.ActivityThread.main(ActivityThread.java:5068) 
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:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 

getQuestionSetFromDb (SplashActivity.java:109) fait référence à

List<Question> questions = myDbHelper.getQuestionSet(diff, numQuestions); 

qui fait référence à

public List<Question> getQuestionSet(int difficulty, int numQ){ 
    List<Question> questionSet = new ArrayList<Question>(); 
    Cursor c = myDataBase.rawQuery("SELECT * FROM QUESTIONS WHERE DIFFICULTY=" + difficulty + 
      " ORDER BY RANDOM() LIMIT " + numQ, null); 
    while (c.moveToNext()){ 
     //Log.d("QUESTION", "Question Found in DB: " + c.getString(1)); 
     Question q = new Question(); 
     q.setQuestion(c.getString(1)); 
     q.setAnswer(c.getString(2)); 
     q.setOption1(c.getString(3)); 
     q.setOption2(c.getString(4)); 
     q.setOption3(c.getString(5)); 
     q.setRating(difficulty); 
     questionSet.add(q); 
    } 
    return questionSet; 
} 

}

Est-ce que quelqu'un sait de une cause probable? Il est étrange que cela ne se produise qu'avec une petite quantité d'installations et que le fait de ne pas pouvoir déterminer le niveau SDK/périphérique utilisé rend la tâche plus difficile.

Toute aide est appréciée

EDIT: En raison des réponses que je suis, y compris la façon dont le db est créé.

D'abord, mon activité a ce (ce qui est la même méthode qui provoque le crash)

private List<Question> getQuestionSetFromDb() throws Error { 
    int diff = getDifficultySettings(); 
    int numQuestions = getNumQuestions(); 
    DBHelper myDbHelper = new DBHelper(this); 
    try { 
     myDbHelper.createDataBase(); 
    } catch (IOException ioe) { 
     throw new Error("Unable to create database"); 
    } 
    try { 
     myDbHelper.openDataBase(); 
    }catch(SQLException sqle){ 
     throw sqle; 
    } 
    List<Question> questions = myDbHelper.getQuestionSet(diff, numQuestions); 
    myDbHelper.close(); 
    return questions; 
} 

myDBhelper.createdatabase() appelle

public void createDataBase() throws IOException{ 

    boolean dbExist = checkDataBase(); 
    if(!dbExist) 
    { 
     //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"); 
     } 
    } 
} 

checkDatabase()

private boolean checkDataBase(){ 
    SQLiteDatabase checkDB = null; 
    try{ 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    }catch(SQLiteException e){ 
     //database does't exist yet. 
    } 
    if(checkDB != null){ 
     checkDB.close(); 
    } 

    return checkDB != null ? true : false; 
} 

copyDatabase()

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))>0){ 
     myOutput.write(buffer, 0, length); 
    } 

    //Close the streams 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

} 

Variables

private static String DB_PATH = "/data/data/com.app.myapp/databases/"; 
private static String DB_NAME = "questionsDb"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 

Apoligies, je devrais avoir inclus cette initialement

+0

Avez-vous récemment mis à niveau le schéma DB pour inclure la table Questions? – hooked82

+0

Non, les tables de base de données ont toujours été les mêmes. Depuis que j'ai téléchargé sur le marché il n'y a eu aucun changement de base de données du tout. – PapaJon

+0

Eh bien, l'erreur semble évidente; votre table ne peut pas être trouvée. Donc, je commencerais à regarder la partie où elle a été créée, en s'assurant qu'elle soit créée du tout. Aussi, il pourrait être une idée d'attraper cette erreur spécifique, puis créer la table si elle se produit. –

Répondre

0

Les rapports d'erreur sur une base de données manquantes "QUESTIONS". DB_NAME est "questionsDb".

La difficulté int, ajoutée avec + à une chaîne, me laisse perplexe (a déjà été rapporté par un autre utilisateur plus tôt dans ce fil de discussion).

0

Je me sens juste la façon dont vous créez la base de données est à l'origine du problème. Il n'y a rien de mal à cela; comme vous l'avez dit, cela fonctionne sur 98% des appareils. À mon avis, vous êtes probablement mieux d'étendre SQLiteOpenHelper. Cela prend soin de créer votre base de données si elle n'existe pas et vous n'avez pas à faire des contrôles manuellement que vous faites.

Questions connexes