2011-08-25 8 views
5

Recientemente publiqué una aplicación en el mercado. Desde la consola de desarrolladores, parece que alrededor del 1-2% de mis usuarios tienen este problema. El 1-2% es pequeño, pero las personas están más inclinadas a dejar comentarios cuando algo no funciona en lugar de hacerlo, lo que podría afectar negativamente a las descargas.SQLiteException: solo ocurre en algunos dispositivos

Lamentablemente, la consola de desarrolladores solo muestra la plataforma como "otra", pero mi aplicación está disponible para aquellos con SDK 1.6+. Tampoco puedo volver a crear este problema y ningún usuario me contactó directamente, por lo que no puedo obtener más información sobre los dispositivos en los que falla.

Aquí está la pila

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) se refiere a

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

que se refiere a

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; 
} 

}

¿Alguien sabe de una causa probable? Es extraño que esto solo suceda con una pequeña cantidad de instalaciones y no poder determinar el nivel/dispositivo de SDK que están usando lo hace más difícil.

Cualquier ayuda se agradece

EDIT: Debido a las respuestas que estoy incluyendo cómo se crea la db.

En primer lugar, mi actividad tiene esta (este es el mismo método que causa el accidente)

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() llama a

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, realmente debería haber incluido esta inicialmente

+0

¿Ha actualizado recientemente el esquema de BD para incluir la tabla de Preguntas? – hooked82

+0

No, las tablas de la base de datos siempre han sido iguales. Desde que subí al mercado no ha habido cambios en la base de datos. – PapaJon

+0

Bueno, el error parece obvio; tu mesa no puede ser encontrada Así que comenzaría a buscar la parte donde se crea, asegurándome de que se cree. También puede ser una idea detectar este error específico y luego crear la tabla si ocurre. –

Respuesta

0

Los informes de error sobre una base de datos "PREGUNTAS" faltante. DB_NAME es "questionsDb".

La dificultad int, añadida con + a una cadena, me desconcierta también (ya se informó de otro usuario anteriormente en este hilo).

0

Siento que la forma en que está creando la base de datos está causando el problema. No tiene nada de malo; como dijiste, funciona en el 98% de los dispositivos.

En mi opinión, probablemente sea mejor que extienda SQLiteOpenHelper. Esto se encarga de crear su base de datos si no existe y no tiene que hacer ninguna comprobación manualmente.

Cuestiones relacionadas