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.

  • Base de datos SQlite programaticamente convertir en formato de archivo de Excel en Android
  • ORM en Android SQLite y esquema de base de datos
  • sqlite Android - cómo obtener el valor de col / fila específica
  • Multi claves primarias en Android SQLite
  • Androide sqlite comprobar si se ha insertado un nuevo valor
  • Cómo utilizar SQLiteDatabase.CursorFactory
  • ormlite para android: ayuda de diseño y más
  • DETALLES DE EXCEPCIÓN: java.lang.IllegalStateException: Proceso 3188 Cuota de cursor excedido 100, lo matará con Rom MIUI
  • Mostrar datos SQLite en RecyclerView
  • Aplicación Android phonegap que tiene problemas con SQlite y almacenamiento local en dispositivos Samsung Galaxy
  • SQLITE INSERT con ID manual (clave principal)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.