2013-05-07 56 views
1

所以,我的應用程序在用戶崩潰報告中出現此錯誤。以下是報告:android.database.CursorIndexOutOfBoundsException ...再次

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
at android.database.AbstractCursor.checkPosition(AbstractCursor.) 
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.) 
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard.nextQuestionGrad(Kviz10Hard.) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard.access$1(Kviz10Hard.) 
at rs.androidaplikacije.zastaveigradovi.Kviz10Hard$2.run(Kviz10Hard.java:68) 
at android.os.Handler.handleCallback(Handler.) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.) 
at android.app.ActivityThread.main(ActivityThread.) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.) 
at dalvik.system.NativeStart.main(Native Method) 

而這裏提到的代碼:

private void nextQuestionGrad() { 

    flag.setVisibility(View.GONE); 
    dodatnoPitanje.setVisibility(View.VISIBLE); 

    TestAdapter mDbHelper = new TestAdapter(this); 
    DataBaseHelper myDbHelper = new DataBaseHelper(this); 

    if(!myDbHelper.checkDataBase()){ 
     mDbHelper.createDatabase(); 
    } 

    try{ 

     mDbHelper.open(); 

     Cursor c = mDbHelper.getTestDataGradovi(mCurrentID); 

     List<Answer> labels = new ArrayList<Answer>(); 

     labels.add(new Answer(c.getString(2), true)); 
     labels.add(new Answer(c.getString(3), false)); 
     labels.add(new Answer(c.getString(4), false)); 
     labels.add(new Answer(c.getString(5), false)); 

     tacanOdg = c.getString(2); 

     Collections.shuffle(labels); 

     dodatnoPitanje.setText(c.getString(1)); 

     bOdgovor1.setText(labels.get(0).option); 
     bOdgovor1.setTag(labels.get(0)); 
     bOdgovor1.setOnClickListener(clickListenerGrad); 

     bOdgovor2.setText(labels.get(1).option); 
     bOdgovor2.setTag(labels.get(1)); 
     bOdgovor2.setOnClickListener(clickListenerGrad); 

     bOdgovor3.setText(labels.get(2).option); 
     bOdgovor3.setTag(labels.get(2)); 
     bOdgovor3.setOnClickListener(clickListenerGrad); 

     bOdgovor4.setText(labels.get(3).option); 
     bOdgovor4.setTag(labels.get(3)); 
     bOdgovor4.setOnClickListener(clickListenerGrad); 

     score.setText("Score: " + brojacTacnihOdgovora); 

    }finally{ 
     mDbHelper.close(); 
    } 
} 

及部分我的適配器類的我使用這個類:

public Cursor getTestDataGradovi(long id){ 
    try{ 
     String sql ="SELECT * FROM tblGradovi WHERE _ID = " + id; 

     Cursor c = mDb.rawQuery(sql, null); 
     if (c!=null){ 
      c.moveToNext(); 
     } 
     return c; 
    }catch (SQLException mSQLException){ 
     Log.e(TAG, "getTestData >>"+ mSQLException.toString()); 
     throw mSQLException; 
    } 
} 

有人能告訴我在哪裏問題?錯誤行(Kviz10Hard。)在這裏:

labels.add(new Answer(c.getString(2), true)); 
+0

你的錯誤來自這裏:光標c = mDbHelper.getTestDataGradovi(mCurrentID);檢查c的值。我敢肯定它是空的 – 2013-05-07 10:46:27

+1

@AsierAranbarri'c'不會被'null',但是光標可能是空的。 – 2013-05-07 10:48:00

+0

ops,是的,我的壞! – 2013-05-07 10:48:45

回答

2

在嘗試從Cursor對象獲取任何數據之前,如果光標只包含一個值,則需要迭代結果或獲取第一個數據。例如所有的結果之間的迭代,你應該做這樣的事情:

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    if(cursor.getCount() > 0){ 
     for(cursor.move(0);cursor.moveToNext();cursor.isAfterLast()){ 
      // get your data here 
     } 
    } 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

或另一種方式來做到這一點:

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    if(cursor.getCount() > 0){ 
     do { 
      // get value 
     } while(cursor.moveToNext()); 
    } 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

,或者如果你是相當肯定的結果應該是隻有一個對象這取決於你的SQL語句,你應該從你的Cursor訪問這樣的事之前調用cursor.moveToFirst();

String sql = "SELECT * FROM myTable"; 
Cursor cursor = mDbHelper.rawQuery(sql, null); 
if(cursor != null){ 
    cursor.moveToFirst(); 
    String myString = cursor.getString(cursor.getColumnIndex("title")); 
    cursor.close(); // close your cursor when you don't need it anymore 
} 

編輯:

如果你真的想在你的數據庫類來創建這樣的功能,我會做這樣的事情:

public static Cursor getUserTitles(int userId){ 
     String sql = "SELECT * FROM myTable WHERE userId=?"; 
     return mDbHelper.rawQuery(sql, new String[]{Integer.toString(userId)}); 
} 

第二個編輯:

更改getTestDataGradovi到:

public Cursor getTestDataGradovi(long id){ 
    String sql ="SELECT * FROM tblGradovi WHERE _ID=?"; 
    return mDb.rawQuery(sql, new String[]{Integer.toString(id)}); 
} 

and add c.moveToFirst();,aft呃Cursor c = mDbHelper.getTestDataGradovi(mCurrentID);

+0

我已經導入sqlite數據庫資產文件夾。每次我從數據庫中獲得一個隨機行。 – marjanbaz 2013-05-07 11:04:27

+0

首先要確保如果您從資產導入整個數據庫,那麼只需使用上述方法從數據庫獲取數據,並且不會失敗。 – hardartcore 2013-05-07 11:07:45

+0

你是什麼意思「正確複製」?我猜如果它在我開始遊戲時起作用,它會被複制到我的手機中。 – marjanbaz 2013-05-07 11:09:23

1

您不檢查遊標是否包含任何結果。你需要檢查返回值c.moveToNext(),或檢查c.getCount()或類似的東西。

+0

我不明白。我做c.moveToNext();在我的適配器類中並返回遊標c。這不好嗎? – marjanbaz 2013-05-07 11:02:11

+0

不,如果光標是空的,那不會對你有幫助! moveToNext正在返回'false',但是您不在任何地方檢查。 – 2013-05-07 11:03:53

+0

那麼,如何在我的代碼中糾正這個問題?這東西不是我強大的西裝,我很害怕。 :( – marjanbaz 2013-05-07 11:08:21