2013-01-14 25 views
20
1 Cursor cursor = contentResolver.query(MY_URI, new String[] { "first" }, null, null, null); 
2 if (cursor != null) { 
3 if (cursor.moveToFirst()) { 
4  first = cursor.getString(cursor.getColumnIndex("first")); 
5  cursor.close(); 
6 } 
7 } 

Sau đó, trên đường # 3 (theo các bản ghi), tôi tất cả bây giờ và sau đó tôi đi qua ngoại lệ này (đoạn trích dưới đây):cửa sổ Cursor không thể được tạo ra từ chất kết dính

android.database.CursorWindowAllocationException: Cursor window could not be created from binder. 
    at android.database.CursorWindow.<init>(CursorWindow.java:134) 
    at android.database.CursorWindow.<init>(CursorWindow.java:41) 
    at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:709) 
    at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:707) 
    at android.database.CursorWindow.newFromParcel(CursorWindow.java:718) 
    at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:196) 

..

Bất kỳ ý tưởng nào tại sao nó lại ném ngoại lệ này? Cảm ơn!

+0

thử này [link] (http://stackoverflow.com/questions/5288384/android-content- resolver-query-return-0-rows-when-it-ought-not-too) –

+0

Có bao nhiêu hàng trong cơ sở dữ liệu đang sao lưu 'ContentResolver'? Ngoại lệ đó được ném nếu con trỏ không phân bổ đủ không gian để lưu trữ dữ liệu cần thiết. Vì bạn không giới hạn số hàng trong truy vấn của mình thông qua lựa chọn args, nên 'con trỏ' của bạn sẽ phân bổ không gian để giữ một bản sao của tất cả các cột' đầu tiên' trong bộ nhớ. Nếu có một số lượng lớn các hàng, có khả năng quá trình này không thể cấp phát bộ nhớ đó. – iagreen

+0

@iagreen, chỉ có một hàng đó là lý do tại sao tôi không thực hiện vòng lặp cho nó. – lorraine

Trả lời

1

Hãy thử cách này:

if (cursor != null) { 
    cursor.moveToFirst(); 
    do { 
    first = cursor.getString(cursor.getColumnIndex("first")); 
    }while(cursor.moveToNext()); 

}

+0

bạn cần phải kiểm tra xem moveToFirst có đúng hay không, nếu không có kết quả, điều này sẽ không hoạt động. –

21

tôi nghi ngờ các lỗi có thể liên quan đến bạn không đóng con trỏ của bạn đúng tất cả các thời gian. Hãy thử:

1 Cursor cursor = contentResolver.query(MY_URI, new String[] { "first" }, null, null, null); 
2 if (cursor != null) { 
3 if (cursor.moveToFirst()) { 
4  first = cursor.getString(cursor.getColumnIndex("first")); 
5 } 
6 cursor.close(); ///// Changed here 
7 } 

Con trỏ phải luôn đóng (bất kể có hay không). Đảm bảo phần còn lại của ứng dụng của bạn cũng đang làm việc này.

+0

cảm ơn justin, sẽ ghi nhớ điều đó khi tôi đang mã hóa – lorraine

+0

Điều này làm việc cho tôi. Sử dụng plugin liên lạc cordova, bắt đầu nhận ngoại lệ trên Android 5.0.1. Lớn lên một vé cho họ để có một cái nhìn: https://issues.apache.org/jira/browse/CB-9630 –

+2

đóng nên luôn luôn ở trong một khối cuối cùng.nếu bất kỳ phần nào của mã trước khi đóng sẽ ném một ngoại lệ thì con trỏ sẽ không bị đóng. –

1

Hãy thử một thread

new Thread(new Runnable(){ public void run(){ 

...here all code 

}}); 

. Nhưng bởi Android SDK mã nguồn trông giống như 4.0.2_r1

130 private CursorWindow(Parcel source) {
131 mStartPos = source. readInt();
132 mWindowPtr = nativeCreateFromParcel (source);
133 if (mWindowPtr == 0) {
134 thrownewCursorWindowAllocationException ("Cursor window could not be "
135 + "created from binder.");
136 }
137 mName = nativeGetName (mWindowPtr);
138 mCloseGuard.open("close");
139 }
nơi mWIndowPtrInt