2011-09-08 58 views
0

要求指標1,我有以下代碼:的Android - 光標例外 - 大小爲1

private Cursor query(String selection, String[] selectionArgs, 
     String[] columns, String tableName) { 
    /* 
    * The SQLiteBuilder provides a map for all possible columns requested 
    * to actual columns in the database, creating a simple column alias 
    * mechanism by which the ContentProvider does not need to know the real 
    * column names 
    */ 
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
    builder.setTables(tableName); 
    Cursor cursor = builder.query(mDatabase, columns, selection, 
      selectionArgs, null, null, null); 
    if (cursor == null) { 
     return null; 
    } else if (!cursor.moveToFirst()) { 
     cursor.close(); 
     return null; 
    } 
    return cursor; 
} 

public List<VEvent> getVEvents(int week, int year) { 
    String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?"; 
    String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) }; 
    Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME); 
    List<VEvent> events = new ArrayList<VEvent>(); 
    while (cursor != null) { 
     VEvent e = new VEvent(); 
     try { 
     e.getProperties().add(new Uid(cursor.getString(1))); 
     e.getProperties().add(new DtStamp(cursor.getString(2))); 
     e.getProperties().add(new Organizer(cursor.getString(3))); 
     e.getProperties().add(new DtStart(cursor.getString(4))); 
     e.getProperties().add(new DtEnd(cursor.getString(5))); 
     e.getProperties().add(new Summary(cursor.getString(6))); 
     e.getProperties().add(new Location(cursor.getString(7))); 
     e.getProperties().add(new Description(cursor.getString(8))); 
     events.add(e); 
     } catch (ParseException ex) { 
      Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage()); 
     } catch (URISyntaxException ex) { 
      Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage()); 
     } 
     cursor.moveToNext(); 
    } 
    return events; 
} 

當我打電話我收到以下異常getVEvents:

09-08 11:03:10.121: ERROR/AndroidRuntime(2696):  android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1 
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
09-08 11:03:10.121: ERROR/AndroidRuntime(2696):  at com.unibean.SettingsDatabase.getVEvents(SettingsDatabase.java:177) 

177線對應

e.getProperties().add(new Uid(cursor.getString(1))); 

在查詢方法和getVEvents中我總是檢查遊標是否爲空,並且我正在使用moveToFirst()和moveToNext(),所以我不太清楚爲什麼會發生異常,以及「索引1請求的大小爲1」實際上是什麼意思。

非常感謝!

+0

嘗試moveToFirst()和GetString(0)。 –

回答

1

的錯誤意味着你要求與指數產品1,但你的請求被髮送到只有列表具有1的大小 - 這意味着它僅包含一個項目,最大指數爲此0

看起來你的查詢只返回一行遊標。

0

試試這個代碼

private Cursor query(String selection, String[] selectionArgs, 
      String[] columns, String tableName) { 
     /* 
     * The SQLiteBuilder provides a map for all possible columns requested 
     * to actual columns in the database, creating a simple column alias 
     * mechanism by which the ContentProvider does not need to know the real 
     * column names 
     */ 
     SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); 
     builder.setTables(tableName); 
     Cursor cursor = builder.query(mDatabase, columns, selection, 
       selectionArgs, null, null, null); 
     return cursor; 
    } 

    public List<VEvent> getVEvents(int week, int year) { 
     String selection = KEY_WEEK + "=? AND " + KEY_YEAR + "=?"; 
     String[] selectionArgs = new String[] { String.valueOf(week), String.valueOf(year) }; 
     Cursor cursor = query(selection, selectionArgs, ALL_CALENDAR_COLUMNS, CALENDAR_TABLE_NAME); 
     List<VEvent> events = new ArrayList<VEvent>(); 
     while (cursor.moveToNext()) { 
      VEvent e = new VEvent(); 
      try { 
      e.getProperties().add(new Uid(cursor.getString(1))); 
      e.getProperties().add(new DtStamp(cursor.getString(2))); 
      e.getProperties().add(new Organizer(cursor.getString(3))); 
      e.getProperties().add(new DtStart(cursor.getString(4))); 
      e.getProperties().add(new DtEnd(cursor.getString(5))); 
      e.getProperties().add(new Summary(cursor.getString(6))); 
      e.getProperties().add(new Location(cursor.getString(7))); 
      e.getProperties().add(new Description(cursor.getString(8))); 
      events.add(e); 
      } catch (ParseException ex) { 
       Log.v("getvevents", "parse exception : " + ex.getLocalizedMessage()); 
      } catch (URISyntaxException ex) { 
       Log.v("getvevents", "uri exception : " + ex.getLocalizedMessage()); 
      } 

     } 
     return events; 
    } 
2

這意味着正是它說。當大小隻有一個時,你試圖訪問元素1(第二個因爲它是從零開始的)。

您對檢測數據集結束的方式有問題。在處理完最後一行後,您的cursor不會奇蹟般地變爲null。相反,它保持相同的價值,但其內部狀態發生變化。

您需要以不同方式檢測數據集的結尾。

您可以使用,例如:

cursor.moveToFirst(); 
while (!cursor.isAfterLast()) { 
    blah blah blah 
    cursor.moveToNext(); 
} 
+0

你的意思是while(!cursor.isAfterLast())? – Jonny

+0

@Jonny,是的,你一定是在編輯的時候抓到我的,我剛剛注意到了那個錯誤。 – paxdiablo