[JAVA] [SQLite] IllegalStateException, die im Cursor auftritt

Wir haben die folgenden Anfragen von Benutzern der von mir entwickelten App KUMIWAKE erhalten.

Früher habe ich es normal verwendet, aber wenn ich versuche, Mitglieder auszuwählen oder zu gruppieren, wird die Meldung "Kumiwake wird aufgrund eines Problems geschlossen" angezeigt. Was soll ich machen?

Aus irgendeinem Grund gab es in der neuesten Version viele Abstürze, daher sind diese Meinungen wirklich hilfreich.

Fehlerursache

Hier gibt es jedoch ein Problem. Ich kann den Fehler in meiner Umgebung nicht reproduzieren. Weder die eigentliche Maschine noch die AVD.

Mit Blick auf die Stapelspur der Play Console war dies wie folgt.

java.lang.IllegalStateException: 
  at android.database.CursorWindow.nativeGetString (CursorWindow.java)
  at android.database.CursorWindow.getString (CursorWindow.java:438)
  at android.database.AbstractWindowedCursor.getString (AbstractWindowedCursor.java:51)
  ...

Als ich es nachgeschlagen habe, sah es wie ein Fehler aufgrund des Cursors der Datenbank aus.

Es schien vorher zu funktionieren, also habe ich den Änderungsverlauf des Cursor-Teils überprüft und es geschafft, die Ursache zu identifizieren.

c.getString (c.getColumnIndex (COL_NAME)) ← Dieser Teil

https://codeday.me/jp/qa/20190421/668862.html Es scheint, dass getColumnIndex (COL_NAME) den Index von COL_NAME nicht finden konnte und wie in dieser Antwort -1 zurückgegeben hat. Dies führt zu "c.getString (-1)" und die Spalte kann nicht gefunden werden! Du hast einen Fehler gesagt. (Spaltennummer ist 0 ~)

Lösung

Vorläufig habe ich mich entschlossen, getColumnIndex () nicht zu verwenden. (Ich möchte es wirklich benutzen ...)

Vor der Änderung: c.getString (c.getColumnIndex (COL_NAME)) Nach der Änderung: c.getString (1)

Ich habe die Spaltennummer direkt angegeben. Es scheint, dass es nach der Korrektur normal funktioniert hat. Ich bin glücklich.

Wenn Sie getColumnIndex (COL_NAME) verwenden möchten, wird -1 zurückgegeben, wenn die Spalte nicht gefunden wird. Verwenden Sie daher besser getColumnIndexOrThrow (COL_NAME) wie in [diesem Artikel] [1]. Korrekt.

Fragen bleiben

https://teratail.com/questions/128793 Jemand hatte ein ähnliches Problem. Wie Sie in dieser Frage sehen können, scheint es, dass getColumnIndex () je nach Terminal einen guten Wert zurückgeben kann oder nicht. Es hing nicht von der Android-Version ab, also ist es vielleicht ein Geräteproblem ... Wenn Sie mit SQLite vertraut sind, bringen Sie es mir bitte bei. (Weinen)

Referenz

Android Developers [Yukis Zweig Android: Cursor API Zusammenfassung] [1] [1]:http://yuki312.blogspot.com/2012/03/androidcursorapi.html

Recommended Posts

[SQLite] IllegalStateException, die im Cursor auftritt
Was tun, wenn in PlayFramework eine IllegalStateException auftritt?
[Java] Erläutert die ConcurrentModificationException, die in java.util.ArrayList für Neulinge auftritt
IllegalArgumentException tritt in PathMatcher :: Matches auf