2011-08-25 19 views
5

Niedawno opublikowałem aplikację na rynku. Wygląda na to, że około 1-2% moich użytkowników ma ten problem z poziomu konsoli programistów. 1-2% jest małe, ale ludzie są bardziej skłonni do komentowania, gdy coś nie działa, a nie kiedy może to negatywnie wpłynąć na pobieranie.SQLiteException - dzieje się tylko na niektórych urządzeniach

Niestety, w konsoli programistów wymieniona jest tylko platforma jako "inna", ale moja aplikacja jest dostępna dla użytkowników z pakietem SDK 1.6+. Nie mogę też odtworzyć tego problemu i żaden użytkownik nie skontaktował się ze mną bezpośrednio, więc nie mogę uzyskać więcej informacji o urządzeniach, na których nie działa.

Oto stos

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) odnosi się do

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

który odnosi się do

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

}

Czy ktoś wie z prawdopodobna przyczyna? Dziwne jest to, że dzieje się tak tylko przy niewielkiej liczbie instalacji i nie można określić poziomu/urządzenia SDK, z których korzystają, co utrudnia.

Każda pomoc jest mile widziana

EDIT: Ze względu na odpowiedzi jestem tym, w jaki sposób tworzony jest db.

Po pierwsze, moja działalność ma to (jest to ta sama metoda, która powoduje awarię)

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() wywołuje

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(); 

} 

Zmienne

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, naprawdę powinno zawierać to początkowo

+0

Czy niedawno uaktualniono schemat DB, aby uwzględnić tabelę pytań? – hooked82

+0

Nie, tabele bazy danych zawsze były takie same. Odkąd wprowadziłem na rynek, nie było żadnych zmian w bazie danych. – PapaJon

+0

Cóż, błąd wydaje się oczywisty; nie można znaleźć twojej tabeli. Zacznę więc przyglądać się części, w której zostanie utworzony, upewniając się, że w ogóle zostanie utworzony. Również może to być pomysł, aby złapać ten konkretny błąd, a następnie utworzyć tabelę, jeśli wystąpi. –

Odpowiedz

0

raportów o błędach o brakującym "Pytania" bazy danych. DB_NAME to "questionsDb".

Trudności int, dołączone z + do ciąg, również mnie zagadki (zostały już zgłoszone przez innego użytkownika wcześniej w tym wątku).

0

Po prostu czuję, że sposób w jaki tworzysz bazę danych powoduje problem. Nie ma w tym nic złego; jak powiedziałeś, działa na 98% urządzeń.

Moim zdaniem, prawdopodobnie lepiej jest przedłużyć SQLiteOpenHelper. Dba o tworzenie bazy danych, jeśli nie istnieje i nie musisz ręcznie wykonywać żadnych kontroli.

Powiązane problemy