2013-11-27 71 views
0

我試圖從我的數據庫中獲取數據。確保光標在從它訪問數據前正確初始化

這是我的代碼:

String[] columns = new String[] {COLUMN_FACEBOOK_ALBUM_COVER, COLUMN_FACEBOOK_ALBUM_IS_ACTIVE}; 

     String whereClause = COLUMN_FACEBOOK_ALBUM_IS_ACTIVE + "= '" + 1 + "'"; 

     Cursor cAlbum = ourDatabase.query(TABLE_FACEBOOK, columns, whereClause,null, null, null, null); 

     columns = new String[] {COLUMN_FACEBOOK_BIG_IMAGE, COLUMN_FACEBOOK_IMAGE_IS_ACTIVE}; 

     whereClause = COLUMN_FACEBOOK_IMAGE_IS_ACTIVE + "= '" + 1 + "'"; 

     Cursor cImage = ourDatabase.query(TABLE_FACEBOOK_IMAGES, columns, null,null, null, null, null); 

     String[] list = new String[cAlbum.getCount()+cImage.getCount()]; 

     int p = 0; 

     if(cAlbum.getCount() < 1 && cImage.getCount() < 1) 
     { 
      cAlbum.close(); 
      cImage.close(); 
      return null; 
     } 

     Log.i("cImage length", cImage.getCount()+""); 
     Log.i("cAlbum length", cAlbum.getCount()+""); 

     Log.i("list length", list.length+""); 

     int i = cImage.getColumnIndex(COLUMN_FACEBOOK_BIG_IMAGE); 
     int j = cAlbum.getColumnIndex(COLUMN_FACEBOOK_ALBUM_COVER); 

     for (cAlbum.moveToFirst(); !cAlbum.isAfterLast(); cAlbum.moveToNext()) 
     { 
      list[p] = cAlbum.getString(j); 
      p++; 
     } 

     for (cImage.moveToFirst(); !cImage.isAfterLast(); cImage.moveToNext()) 
     { 
      list[p] = cImage.getString(i); 
      Log.i("image length", list[p].length()+""); 
      p++; 
     } 

     cAlbum.close(); 
     cImage.close(); 

     return list; 

該行的代碼失敗:

list[p] = cImage.getString(i); 

的錯誤信息是:

11-27 12:34:59.683: E/CursorWindow(6901): Failed to read row 2, column 0 from a CursorWindow which has 2 rows, 2 columns. 
11-27 12:34:59.683: D/AndroidRuntime(6901): Shutting down VM 
11-27 12:34:59.683: W/dalvikvm(6901): threadid=1: thread exiting with uncaught exception (group=0x41e9b930) 
11-27 12:34:59.693: E/AndroidRuntime(6901): FATAL EXCEPTION: main 
11-27 12:34:59.693: E/AndroidRuntime(6901): java.lang.RuntimeException: Unable to create service com.example.imageswidget.WidgetService: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2667) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.app.ActivityThread.access$1600(ActivityThread.java:153) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1329) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.os.Looper.loop(Looper.java:137) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.app.ActivityThread.main(ActivityThread.java:5227) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at dalvik.system.NativeStart.main(Native Method) 
11-27 12:34:59.693: E/AndroidRuntime(6901): Caused by: java.lang.IllegalStateException: Couldn't read row 2, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.database.CursorWindow.nativeGetString(Native Method) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.database.CursorWindow.getString(CursorWindow.java:434) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at com.example.imageswidget.DataBaseMain.getFacebookImagesForWidget(DataBaseMain.java:943) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at com.example.imageswidget.WidgetService.onCreate(WidgetService.java:51) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  at android.app.ActivityThread.handleCreateService(ActivityThread.java:2657) 
11-27 12:34:59.693: E/AndroidRuntime(6901):  ... 10 more 

對於呼叫日誌

Log.i("image length", list[p].length()+""); 

在代碼破解之前,我會收到很少的電話。 這個問題似乎只發生在一些行上,但錯誤代碼並不告訴我問題是什麼。

感謝您的幫助。

回答

-1

初始化數據庫事務中的遊標。

Cursor cAlbum = null, cImage = null; 
db.beginTransaction(); 
try { 
    // init cursors 
    cAlbum = db.query(...); 
    cImage = db.query(...); 
} catch(SQLException e) { 
    e.printStackTrace(); 
} finally { 
    db.endTransaction(); 
} 

檢查遊標是否不爲空。

if(cAlbum != null && cImage != null) { 
    while(cAlbum.moveToNext()) { 
     // get data from cAlbum and do what you need 
    } 
    while(cImage.moveToNext()) { 
     // get data from cImage and do what you need 
    } 

    cAlbum.close(); 
    cImage.close(); 
} 
+0

這不是OP的問題:遊標是非空的。 – laalto

+0

請檢查更新後的答案。 –

1

嘗試在使用光標前調用cursor.moveToFirst()。讓我知道如果這工作。

+0

沒有爲我工作:-( –

5

我以前遇到過這個例外。在我的情況下,原因是一個數據庫單元包含太多的數據(一個巨大的字符串)。從代碼判斷(COLUMN_FACEBOOK_BIG_IMAGE)我猜你遇到了同樣的問題。 解決方案是檢查放入數據庫的字符串大小(並在需要時縮小圖像大小)。 希望這有助於!

+0

這是我遇到這個錯誤的問題。更多細節在這裏:http://stackoverflow.com/questions/5406429/cursor-size-limit-in-android-sqlitedatabase – Ralf

9

就我而言,這是因爲我沒有在傳遞給CursorLoader構造函數的投影中包含列。這意味着我試圖訪問已返回的遊標中不存在的列中的數據。

我希望這可以幫助別人......

0

我也有類似的答案Oladipo Olasemo但發生在我身上的V型表,我怎麼能解決這個問題。我相信這是分享我的經驗的最好的帖子,尤其是涉及FTS3虛擬表格的錯誤,至少在我的情況下。關於這個問題有很多問題,OP的原始問題太籠統了,所以這裏是我對這個問題的看法。

我遇到這個錯誤是由於虛擬表中的一些限制,考慮這一個:

create virtual table V1 using FTS3 (content="MyTable", content1, content2); 

當我搜索有關內容1或內容2特定關鍵字的基礎上,我意識到我是在虛擬作出查詢基地通過這個查詢表:

select * from V1 where V1 match 'hello' 

由於這是一個虛擬表我錯過了,它會投影到結果根據你如何構建的v-表本身設置。所以它只有content1和content2的列。

我正在開發一個android應用程序,它從搜索結果中進行查詢,並從結果集中選擇一個項目,我的後端處理過程處理所選項目並查詢列集中不存在的信息。因此,給我這個錯誤。

我解決這個問題的方法雖然不是很精彩,但是可以從v表中查詢結果來獲得每個項目的ID,它總是有。然後,根據我獲得的結果ID構建一個查詢字符串庫,然後使用它來檢索我需要的投影所需的數據。我從這裏得到了一個想法question

我相信有很多方法可以遇到這個錯誤。我花了差不多一個小時來弄清楚可能會造成這種情況的原因。對我而言,投影在日誌上的錯誤並不是很有幫助。如果你真的知道數據如何在你的應用中流動,那真的很有幫助。

1

也許你正在使用你的舊數據庫。如果您更改了數據庫中的某些表和字段,並且您正在嘗試其他設備(這是您在數據庫更改之前已經安裝了應用程序的情況),則應該只刪除舊數據庫並創建新文件。

2

U應該修復此問題以解決此錯誤消息「無法從CursorWindow讀取第0行,第1列,確保在從其訪問數據之前正確初始化光標。它在我的代碼中起作用。

1.嘗試通過moveToFirst定位光標,然後再從中讀取數據。

2.檢查爲空值>如果(C!= NULL & & c.moveToFirst()){}

3.檢查用於count->(C!= NULL & & c.getCount() > 0 & & c.moveToFirst()){}

+0

謝謝@niharika你拯救我的一天。 –

相關問題