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

Poi sulla linea # 3 (secondo i registri), io ogni tanto mi imbatto in questa eccezione (estratto qui di seguito):finestra del cursore non può essere creata da legante

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) 

..

Qualche idea del motivo per cui questa eccezione viene lanciata? Grazie!

+0

provare questo [link] (http://stackoverflow.com/questions/5288384/android-content- resolver-query-return-0-rows-when-it-should-not-too) –

+0

Quante righe sono nel database che supporta il 'ContentResolver'? Questa eccezione viene generata se il cursore non riesce a allocare spazio sufficiente per memorizzare i dati necessari. Dato che non stai limitando il numero di righe nella tua query tramite gli argomenti di selezione, il 'cursore' assegnerà lo spazio per mantenere una copia di tutta la colonna' prima' nella memoria. Se esiste un numero elevato di righe, potenzialmente il processo potrebbe non riuscire ad allocare quella memoria. – iagreen

+0

@iagreen, c'è solo una riga per cui non ho fatto un ciclo per questo. – lorraine

risposta

1

provare in questo modo:

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

}

+0

devi controllare se moveToFirst è vero o no, se non ci sono risultati, questo non funzionerà. –

21

Ho il sospetto che l'errore può essere correlato a non chiudere le cursori correttamente tutto il tempo. Prova:

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 } 

Il cursore deve essere sempre chiuso (indipendentemente dal fatto che sia vuoto o meno). Assicurati che anche il resto della tua app esegua questo.

+0

grazie justin, terrò a mente quando sto codificando – lorraine

+0

Questo ha funzionato per me. Usando il plugin cordova contacts, ho iniziato a ricevere l'eccezione su android 5.0.1. Ha alzato un biglietto per loro per dare un'occhiata: https://issues.apache.org/jira/browse/CB-9630 –

+2

close dovrebbe sempre essere in un blocco finalmente.se una qualsiasi parte del codice prima della chiusura genera un'eccezione, il cursore non verrà chiuso. –

1

Prova un altro thread

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

...here all code 

}}); 

. Ma da Android SDK codici sorgente assomigliano 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 }
dove mWIndowPtr è Int