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.
- Sincronizar las bases de datos sqlite con mysql
- Intel XDK: Conexión de la aplicación móvil a una base de datos
- Devolver datos de AsyncTask Android
- HTML5 SQLite vs Base de datos nativa en caso de PhoneGap
- Ver base de datos SQLite en el dispositivo en Android Studio
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
- Almacenar objetos personalizados (Obj definido por el usuario) en la base de datos SQLite de Android
- Mal funcionamiento al eliminar de la tabla de base de datos Sqlite (comportamiento extraordinario de relación)
- Android: ORDER BY en la consulta
- Uso de Rest para almacenar datos en Sqlite
- ¿Cuál es el tamaño máximo de la base de datos SQLite en Android?
- SQLite Database: SQLiteDiskIOException: error de E / S de disco (código 1802)
- Android concurrencia sqlite sin excepciones
- Forma preferida de actualizar sqlite db en android
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.
- Cómo detectar la conversación SMS de grupo
- Android – ¿Por qué autolink ignora la ruta raíz de una URL?