2011-08-25 5 views
5

最近市場にアプリを公開しました。開発者コンソールからは、ユーザーの約1〜2%がこの問題を抱えているようです。 1〜2%は小さいですが、ダウンロードに悪影響を及ぼす可能性があるときよりも、何かがうまくいかないときにコメントを残す傾向があります。SQLiteException - 一部のデバイスでのみ発生する

残念ながら、デベロッパーコンソールにはプラットフォームが「その他」と表示されていますが、私のアプリはSDK 1.6+を使用しているユーザーのみ利用できます。私もこの問題を再現することはできませんし、ユーザーが私に直接連絡を取ったことがないので、失敗したデバイスに関する情報をもう取得できません。ここで

は、スタック

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)は

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

}

、誰もが知っているを参照

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

を指していますの考えられる原因は?これは少量のインストールでしか起こらず、使用しているSDKのレベル/デバイスを判断できないことがより困難になるのは不思議です。

すべてのヘルプは

EDITを高く評価されています原因私は、DBの作成方法を含めていた応答に。

まず、私の活動は

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

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

} 
個の

変数

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、私は本当に不足している "質問" データベースについてこの当初

+0

最近、質問表を含むようにDBスキーマをアップグレードしましたか? – hooked82

+0

いいえ、データベーステーブルは常に同じです。私は市場にアップロードして以来、データベースの変更は全くありませんでした。 – PapaJon

+0

エラーは明らかです。あなたのテーブルは見つかりません。だから、私はそれが作成される部分を見て、それが全く作成されていないことを確認し始めます。この特定のエラーをキャッチして、それが発生した場合はテーブルを作成することも考えられます。 –

答えて

0

エラーレポートが含まれている必要があります。 DB_NAMEは "questionsDb"です。

文字列に+を付加したint難易度が私にも当てはまります(このスレッドの前の別のユーザーから既に報告されています)。

0

データベースを作成しているように感じるだけで問題が発生しています。それには何も問題はありません。あなたが言ったように、それはデバイスの98%で動作します。

私の意見では、SQLiteOpenHelperを延長するほうがよいでしょう。これは、存在しない場合にデータベースを作成し、手動でチェックする必要はありません。

関連する問題