2013-05-13 1 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를 반환한다는 것입니다의 크기 이런 이유로 당신을 위해, 요청

: 당신은 항상 어떻게 조건 커서의 유효성을 감지하고이 조건에 "조치를"랩하는 "편리한"도구를 나타냅니다 moveToFirst() 메서드에서 반환 값을 확인 커서 상대하고있는 때마다 Exception

을 받고

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

+0

@marjanbaz 님이 logcat을 사용하는 데 약간의 오류 메시지가 표시 될 수 있습니까? 그러면 문제가 어디 있는지 알 수 있습니다. 커서가 비어있는 경우 db에 데이터 또는 특정 행이 포함되지 않은 것일 수 있습니다. 'NULL'이면 'SQLiteDatabase'에 문제가 있습니다. – Sajmon

+0

커서가 왜 비어 있는지 알 수 없습니다. 나는 정확히 197 열 6 열 있습니다. 매번 임의의 행을 그립니다. – marjanbaz

0

Cursor 데이터에 액세스하려고하지만 비어있는 것처럼 보입니다. 실제로 커서가 비어 있는지 확인하는 c.moveToFirst()를 사용 - 그것은 부울 표시 반환 커서가 null의 경우 boolean isFilledWithData = c.moveToFirst()

+0

내 nextQuestionGrad() 또는 클래스 변수로 선언합니까? – marjanbaz