Cursor-Fenster kann nicht erstellt werden von binder

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 }

Dann auf Zeile #3 (laut den logs), die ich hin und wieder stoße ich auf diese exception (Auszug):

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)

...

Irgendwelche Ideen, warum es wirft diese Ausnahme? Danke!

  • versuchen Sie, diese link
  • Wie viele Zeilen sind in der Datenbank, sichern der ContentResolver? Diese Ausnahme wird geworfen, wenn der cursor fehl genügend Speicherplatz zum speichern der Daten benötigt. Da Sie keine Beschränkung der Anzahl der Zeilen in Ihre Abfrage über die Auswahl args, Ihre cursor wird Speicherplatz behalten Sie eine Kopie aller von Spalte first im Speicher. Wenn es eine große Anzahl von Zeilen, die potenziell den Prozess nicht zuordnen, dass der Speicher.
  • es gibt nur eine Zeile, das ist, warum ich nicht einen loop für ihn.
  • Die einzige andere Sache, die ich denken kann, ist, es ist immer ein Paket beschädigt zurück.
  • Können Sie näher auf das "Paket beschädigt". Diese Ausnahme ist nicht immer gefunden, aber es gibt Zeiten, in denen es aufgetreten ist, Frage ich mich, ob es ist, weil andere Dinge.
  • Den code nicht CursorWindow$1.createFromParcel, die Sie versuchen, zu erstellen eine CursorWindow aus einer Parcel Objekt. Wenn es nicht zu Versagen, auf die Zuordnung, könnte es scheitern, weil es ist nicht immer Daten für das Paket richtig. Ich kann nur spekulieren, warum das sein könnte-vielleicht ist die Verbindung zu den contentResolver ist nicht mehr gültig (wie das halten einer veralteten Griff auf die es während der Drehung des Geräts, hintergrund-thread, etc), das anderen Ende der content resolver ist nicht da irgendeinem Grund (keine Daten-Verbindung, SD-Karte gemountet, etc.), oder eine andere Frage,
  • wenn Sie möchten, dass einzelne Ergebnis dann verwenden, um durch d.h. der Letzte parameter der Funktion und gehören begrenzen zum Beispiel verwenden, "id DESC limit 1", um Ihr Ergebnis nach id mit dem einzigen Ergebnis

InformationsquelleAutor reika | 2013-01-14
Schreibe einen Kommentar