SQLiteException – sólo ocurre en algunos dispositivos

Recientemente he publicado una aplicación en el mercado. Desde la consola de desarrolladores parece que alrededor del 1-2% de mis usuarios están teniendo este problema. 1-2% es pequeño, pero la gente está más inclinada a dejar comentarios cuando algo no funciona en lugar de cuando lo hace lo que podría afectar negativamente las descargas.

Desafortunadamente, la consola de desarrolladores solo lista la plataforma como 'otra', pero mi aplicación está disponible para aquellos con SDK 1.6+. También no puedo volver a crear este problema y ningún usuario me ha contactado 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 sólo esté ocurriendo con una pequeña cantidad de instalaciones y ser incapaz de determinar el nivel / dispositivo de SDK que están utilizando lo hace más difícil.

Cualquier ayuda es apreciada

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

En primer lugar, mi actividad tiene esto (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; } 

Llamadas de myDBhelper.createdatabase ()

 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 esto inicialmente

2 Solutions collect form web for “SQLiteException – sólo ocurre en algunos dispositivos”

Los informes de error sobre una base de datos "QUESTIONS" que faltan. DB_NAME es "questionsDb".

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

Sólo siento que la forma en que está creando la base de datos está causando el problema. No tiene nada de malo; Como usted dijo que funciona en el 98% de los dispositivos.

En mi opinión, es probable que sea mejor extender SQLiteOpenHelper . Esto se encarga de crear su base de datos si no existe y no tiene que hacer las comprobaciones manualmente que hacer.

  • Implementación SQLite deficiente? Acceso a los datos por primera vez demasiado lento
  • Una buena biblioteca de ORM de Java en Android
  • Base de datos de SQLite de SQL, bloqueo y versión
  • Actualizar una columna como suma de otras dos columnas
  • Unir tablas en SQLite.Net con LINQ en xamarin.android no es compatible
  • HTML5 SQLite vs Base de datos nativa en caso de PhoneGap
  • Orden de orden inversa de SQLiteQueryBuilder
  • ¿Cómo puedo ver el contenido de un sqlite db de mi aplicación en un dispositivo real?
  • ¿Por qué onUpgrade () no está siendo invocado en la base de datos Android sqlite?
  • Uso de la base de datos existente en Android Wear
  • El grupo por consulta no funciona en android 2.1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.