[JAVA] [SQLite] IllegalStateException qui se produit dans Cursor

Nous avons reçu les demandes suivantes des utilisateurs de l'application KUMIWAKE que j'ai développée.

Je l'utilisais normalement, mais lorsque j'essaye de sélectionner ou de grouper des membres, j'obtiens le message "Kumiwake sera fermé en raison d'un problème". Que devrais-je faire?

Pour une raison quelconque, il y a eu de nombreux plantages dans la dernière version, donc ces avis sont vraiment utiles.

Cause d'erreur

Cependant, il y a un problème ici. Je ne peux pas reproduire l'erreur dans mon environnement. Ni la machine réelle ni l'AVD.

En regardant la trace de pile de la Play Console, c'était comme suit.

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)
  ...

Quand je l'ai recherché, cela ressemblait à une erreur due au curseur de la base de données.

Cela semblait fonctionner avant, j'ai donc examiné l'historique des modifications de la partie Cursor et j'ai réussi à identifier la cause.

c.getString (c.getColumnIndex (COL_NAME)) ← Cette partie

https://codeday.me/jp/qa/20190421/668862.html Il semble que getColumnIndex (COL_NAME) n'a pas pu trouver l'index de COL_NAME et a renvoyé -1 comme dans cette réponse. Cela donne c.getString (-1) et la colonne est introuvable! Vous avez dit une erreur. (Le numéro de colonne est 0 ~)

Solution

Pour le moment, je me suis installé dans le sens de ne pas utiliser getColumnIndex (). (Je veux vraiment l'utiliser ...)

Avant modification: c.getString (c.getColumnIndex (COL_NAME)) Après modification: c.getString (1)

J'ai spécifié le numéro de colonne directement. Il semble que cela a fonctionné normalement après la correction. Je suis heureux.

Si vous voulez utiliser getColumnIndex (COL_NAME), -1 sera renvoyé lorsque la colonne n'est pas trouvée, il est donc préférable d'utilisergetColumnIndexOrThrow (COL_NAME)comme dans [cet article] [1]. C'est vrai.

Des questions demeurent

https://teratail.com/questions/128793 Quelqu'un souffrait d'un problème similaire. Comme vous pouvez le voir dans cette question, il semble que getColumnIndex () puisse ou non retourner une bonne valeur en fonction du terminal. Cela ne dépendait pas de la version d'Android, alors c'est peut-être un problème d'appareil ... Si vous connaissez SQLite, apprenez-moi s'il vous plaît. (Pleurs)

référence

Android Developers [Branche de Yuki Android: résumé de l'API Cursor] [1] [1]:http://yuki312.blogspot.com/2012/03/androidcursorapi.html

Recommended Posts

[SQLite] IllegalStateException qui se produit dans Cursor
Que faire si IllegalStateException se produit dans PlayFramework
[Java] explique ConcurrentModificationException qui se produit dans java.util.ArrayList pour les nouveaux arrivants
IllegalArgumentException se produit dans PathMatcher :: matches