2013-01-14 10 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 } 

Następnie na linii # 3 (według kłody), że co jakiś czas spotykam tego wyjątku (fragment poniżej):okno Kursor nie może być stworzony od spoiwa

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) 

..

Jakieś pomysły, dlaczego rzuca ten wyjątek? Dzięki!

+0

spróbuj tego [LINK] (http://stackoverflow.com/questions/5288384/android-content- resolver-query-return-0-rows-when-it-should-not-too) –

+0

Ile wierszy znajduje się w bazie danych, która obsługuje 'ContentResolver'? Ten wyjątek jest generowany, jeśli kursor nie może przydzielić wystarczającej ilości miejsca na przechowywanie potrzebnych danych. Ponieważ nie ograniczasz liczby wierszy w zapytaniu poprzez argumenty wyboru, twój 'kursor 'przydzieli miejsce, aby zachować kopię całej kolumny' pierwszy' w pamięci. Jeśli istnieje duża liczba wierszy, potencjalnie proces może nie zaalokować tej pamięci. – iagreen

+0

@iagreen, jest tylko jeden wiersz, dlatego nie zrobiłem dla niego pętli. – lorraine

Odpowiedz

1

Wypróbuj ten sposób:

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

}

+0

musisz sprawdzić, czy moveToFirst było prawdziwe, czy nie, jeśli nie ma wyników, to nie zadziała. –

21

Podejrzewam, że błąd może być związane nie zamykając kursory właściwie cały czas. Wypróbuj:

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 } 

Kursor powinien być zawsze zamknięty (niezależnie od tego, czy jest pusty). Upewnij się, że robi to również reszta aplikacji.

+0

dzięki Justin, będę o tym pamiętać, kiedy będę kodować – lorraine

+0

To działało dla mnie. Korzystanie z wtyczki cordova Contacts rozpoczęło pobieranie wyjątku na Androida 5.0.1. Podniosłem dla nich bilet, żeby się obejrzał: https://issues.apache.org/jira/browse/CB-9630 –

+2

close powinien zawsze znajdować się w bloku finally.jeśli jakakolwiek część kodu przed zamknięciem zgłasza wyjątek, kursor nie zostanie zamknięty. –

1

Spróbuj innego wątku

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

...here all code 

}}); 

. Ale przez Android SDK kody źródłowe wyglądać 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 }
gdzie mWIndowPtr jest Int

Powiązane problemy