2013-05-13 232 views
0

我的應用程序崩潰報告錯誤。我在資產文件夾中使用導入的sqlite數據庫。我究竟做錯了什麼?下面是從用戶的崩潰報告的錯誤:android.database.CursorIndexOutOfBoundsException ....崩潰報告

android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418) 
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
at rs.androidaplikacije.zastaveigradovi.Kviz20Hard.nextQuestionGrad(Kviz20Hard.java:328) 
at rs.androidaplikacije.zastaveigradovi.Kviz20Hard.access$1(Kviz20Hard.java:307) 
at rs.androidaplikacije.zastaveigradovi.Kviz20Hard$2.run(Kviz20Hard.java:68) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4921) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
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); 
       c.moveToFirst(); 

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

我得到行錯誤:

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

這裏是我的適配器類:

public class TestAdapter 
{ 
    protected static final String TAG = "DataAdapter"; 

    private final Context mContext; 
    private SQLiteDatabase mDb; 
    private DataBaseHelper mDbHelper; 

    public TestAdapter(Context context) 
    { 
     this.mContext = context; 
     mDbHelper = new DataBaseHelper(mContext); 
    } 

    public TestAdapter createDatabase() throws SQLException 
    { 
     try 
     { 
      mDbHelper.createDataBase(); 
     } 
     catch (IOException mIOException) 
     { 
      Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase"); 
      throw new Error("UnableToCreateDatabase"); 
     } 
     return this; 
    } 

    public TestAdapter open() throws SQLException 
    { 
     try 
     { 
      mDbHelper.openDataBase(); 
      mDbHelper.close(); 
      mDb = mDbHelper.getReadableDatabase(); 
     } 
     catch (SQLException mSQLException) 
     { 
      Log.e(TAG, "open >>"+ mSQLException.toString()); 
      throw mSQLException; 
     } 
     return this; 
    } 

    public void close() 
    { 
     mDbHelper.close(); 
    } 

    public Cursor getTestData(String whereClause){ 
      String sql ="SELECT * FROM tblPitanja WHERE 1 = 1 " + whereClause + " ORDER BY RANDOM() LIMIT 1"; 
      return mDb.rawQuery(sql, null); 
     } 

    public Cursor getTestDataGradovi(long id){ 
      String sql ="SELECT * FROM tblGradovi WHERE _ID = " + id; 
      return mDb.rawQuery(sql, null); 
     } 

    public Cursor getTestDataValute(long id){ 
      String sql ="SELECT * FROM tblValute WHERE _ID = " + id; 

      return mDb.rawQuery(sql, null); 
     } 

} 

回答

0

android.database.CursorIndexOutOfBoundsException:指數0要求, 大小爲0

您的問題是最有可能您c.moveToFirst()方法返回false(它指示光標是否爲空),併爲這個原因,你越來越Exception

每當你使用遊標處理總是從一個表示「方便」工具如何檢測光標的有效性與條件和包裝你的「行動」這一條件moveToFirst()方法檢查返回值:

List<Answer> labels = new ArrayList<Answer>(); 
if (c != null) { 
    if (c.moveToFirst()) { 
     // do your stuff 
     ... 
     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)); 
     ... 
    } 
    else { 
    // Cursor is empty 
    } 
} 
else { 
    // Cursor is null 
} 

注意:當您想要從光標所包含的特定列中檢索值時,我建議您使用getColumnIndex(<columnName>)方法來避免「錯字」和「索引」問題。這是非常好的和有效的做法。

+0

當遊標爲空時,你的代碼的其他部分如何處理?什麼時候光標是空的? – marjanbaz 2013-05-13 16:48:59

+0

@marjanbaz show可能會給logcat一些錯誤信息給你?那麼你知道問題在哪裏。如果遊標爲空,則可能您的數據庫不包含數據或特定行。如果是NULL,問題出現在SQLiteDatabase中。 – Sajmon 2013-05-13 16:54:30

+0

我只是不明白爲什麼光標會變空。我有197列6列。每次我畫一個隨機的行。 – marjanbaz 2013-05-13 17:43:07

0

您正試圖訪問Cursor數據,但它似乎爲空。使用c.moveToFirst()實際檢查遊標是否爲空 - 它返回一個布爾指示:boolean isFilledWithData = c.moveToFirst()

+0

我是否在我的nextQuestionGrad()中聲明瞭這個或者是作爲一個類變量? – marjanbaz 2013-05-13 16:51:13