android.la base de données.CursorIndexOutOfBoundsException
Le code d'accès aux données dans mon application Android soulève une exception.
Voici le code qui provoque l'exception:
String getPost = "SELECT * FROM " + TABLE_POST + ";";
Cursor result = getReadableDatabase().rawQuery(getPost, null);
List posts = new ArrayList();{
Log.d("count", result.getCount() + " post rows");
while (result != null && result.moveToNext());
Post post = new Post();
post.setPostId(result.getInt(0));
posts.add(post);
....
}
L'exception soulevée est:
android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2 exception
Le journal méthode produit le résultat 2 post rows
.
Quel est le problème ici?
Edit:
J'ai ajouté le plein de trace de pile, de sorte que ceux qui souhaitent vue, il peut le faire.
11-14 09:57:50.538: W/dalvikvm(4710): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
11-14 09:57:50.608: E/AndroidRuntime(4710): FATAL EXCEPTION: main
11-14 09:57:50.608: E/AndroidRuntime(4710): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.innolabmm.software.collaboration/com.innolabmm.software.collaboration.PostCommentActivity}: android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.os.Looper.loop(Looper.java:137)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread.main(ActivityThread.java:5041)
11-14 09:57:50.608: E/AndroidRuntime(4710): at java.lang.reflect.Method.invokeNative(Native Method)
11-14 09:57:50.608: E/AndroidRuntime(4710): at java.lang.reflect.Method.invoke(Method.java:511)
11-14 09:57:50.608: E/AndroidRuntime(4710): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
11-14 09:57:50.608: E/AndroidRuntime(4710): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
11-14 09:57:50.608: E/AndroidRuntime(4710): at dalvik.system.NativeStart.main(Native Method)
11-14 09:57:50.608: E/AndroidRuntime(4710): Caused by: android.database.CursorIndexOutOfBoundsException: Index 2 requested, with a size of 2
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
11-14 09:57:50.608: E/AndroidRuntime(4710): at com.innolabmm.software.collaboration.data.CollaborationDbHandler.fetchAllPost(CollaborationDbHandler.java:362)
11-14 09:57:50.608: E/AndroidRuntime(4710): at com.innolabmm.software.collaboration.PostCommentActivity.onCreate(PostCommentActivity.java:48)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.Activity.performCreate(Activity.java:5104)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-14 09:57:50.608: E/AndroidRuntime(4710): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
11-14 09:57:50.608: E/AndroidRuntime(4710): ... 11 more
- Merci de montrer toute la trace de la pile plutôt que de simplement le type et le message.
- Vous n'avez pas de nous montrer tout le code. Quelque part que vous appelez
result.getInt(2)
ouresult.getString(2)
ou autrement, en utilisant un indice de 2. - J'ai ajouté la trace de la pile, mais je pense que le problème est résolu.
Vous devez vous connecter pour publier un commentaire.
Vous essayez de récupérer un article sur l'index 2, mais cet indice n'existe pas (la taille du Curseur est de 2 si les index sont à 0,1).
Changer votre boucle:
Maintenant, il devrait fonctionner correctement.
Remarque: N'oubliez pas d'appeler
moveToFirst()
méthode qui déplace le Curseur dans le premier enregistrement (implicitement est positionné avant la première ligne) et le prépare pour la lecture. C'est aussi une méthode pratique pour tester si le Curseur est valide ou pas.Note 2: Ne pas utiliser les index de colonnes, vous pouvez tout simplement faire une erreur dans le comptage. Au lieu d'utiliser des noms de colonne - cette approche est généralement recommandé.q.
cursor.getColumnIndex("<columnName>")
Vous n'avez pas déplacé le curseur de l'indice de la première .. Essayez comme ceci ci-dessous
Cette question se pose dans le cas de notre Curseur a données, mais pas encore de pointage au premier indice dans la liste de données.
Pour obtenir d'éviter cette exception, nous devons d'abord vérifier:
Et puis porter le plus d'actions.
if (!cursor.moveToFirst())
vérifie juste si elle a déménagé ou pas. Etcursor.moveToFirst();
n'est appelée que si elle n'a pas bougé à la première.