2011-08-25 24 views
5

मैंने हाल ही में बाजार स्थान पर एक ऐप प्रकाशित किया है। डेवलपर्स कंसोल से ऐसा लगता है कि मेरे उपयोगकर्ताओं में से 1-2% इस समस्या का सामना कर रहे हैं। 1-2% छोटा है लेकिन लोग टिप्पणी छोड़ने के इच्छुक हैं, जब कुछ ऐसा नहीं करता है, जो ऐसा करता है जो डाउनलोड को नकारात्मक रूप से प्रभावित कर सकता है।SQLiteException - केवल कुछ डिवाइसों पर होता है

दुर्भाग्य से डेवलपर्स सांत्वना केवल 'अन्य' के रूप में मंच को सूचीबद्ध करता है, लेकिन मेरे एप्लिकेशन SDK के साथ 1.6+ उन लोगों के लिए उपलब्ध है। मैं इस मुद्दे को फिर से बनाने में भी असमर्थ हूं और किसी भी उपयोगकर्ता ने मुझसे सीधे संपर्क नहीं किया है, इसलिए मैं उन डिवाइसों के बारे में और जानकारी प्राप्त करने में असमर्थ हूं जिन पर यह विफल रहता है।

यहाँ ढेर

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

को

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

}

को संदर्भित करता है किसी को भी पता है है का एक संभावित कारण? यह अजीब बात है कि यह केवल थोड़ी सी मात्रा के साथ हो रहा है और एसडीके स्तर/डिवाइस का उपयोग करने में असमर्थ होने के कारण वे इसे और अधिक कठिन बनाते हैं।

किसी भी मदद की सराहना की

संपादित करें: कैसे 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

आप हाल ही में डीबी स्कीमा प्रश्न तालिका शामिल करने के लिए उन्नयन किया? – hooked82

+0

नहीं, डेटाबेस टेबल हमेशा एक ही रहे हैं। चूंकि मैंने बाजार में अपलोड किया है, इसलिए कोई डेटाबेस परिवर्तन नहीं हुआ है। – PapaJon

+0

अच्छी तरह से त्रुटि स्पष्ट लगता है; आपकी मेज नहीं मिल सकती है। इसलिए मैं उस हिस्से को देखना शुरू कर दूंगा जहां यह बनाया जाता है, यह सुनिश्चित कर लें कि यह बिल्कुल भी बनाया जाए। यह भी एक विशिष्ट त्रुटि को पकड़ने का विचार हो सकता है और फिर यदि ऐसा होता है तो तालिका बनाएं। –

उत्तर

0

त्रुटि रिपोर्ट को शामिल किया है चाहिए। डीबी_NAME "प्रश्न डीबी" है।

int कठिनाई, + स्ट्रिंग के साथ संलग्न, मुझे भी पहेली (पहले से ही इस धागे में किसी अन्य उपयोगकर्ता से रिपोर्ट किया गया था)।

0

मैं बस जिस तरह से आप डेटाबेस पैदा कर रहे समस्या का कारण है लग रहा है। इसमें कुछ भी गलत नहीं है; जैसा कि आपने कहा था कि यह 98% डिवाइस पर काम करता है।

मेरी राय में, आप शायद का विस्तार SQLiteOpenHelper से बेहतर कर रहे हैं। यह आपके डेटाबेस को बनाने का ख्याल रखता है यदि यह अस्तित्व में नहीं है और आपको मैन्युअल रूप से कोई भी चेक करने की आवश्यकता नहीं है।

संबंधित मुद्दे