Cursor.getInt() jette CursorIndexOutOfBoundsException
Donc, j'ai une méthode dans une classe SQLiteDatabaseHelper
qui lit un nombre et renvoie une valeur booléenne, comme l'image ci-dessus montre. Cependant, l'exécution du code jette juste cette exception:
06-28 19:49:45.881: E/AndroidRuntime(355): FATAL EXCEPTION: main
06-28 19:49:45.881: E/AndroidRuntime(355): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
06-28 19:49:45.881: E/AndroidRuntime(355): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.mowdownDevelopments.nagTasks.NagTasksDatabaseHelper.isTaskChecked(NagTasksDatabaseHelper.java:239)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.mowdownDevelopments.nagTasks.NagTaskListFragment.onPrepareActionMode(NagTaskListFragment.java:184)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.actionbarsherlock.internal.ActionBarSherlockCompat$ActionModeCallbackWrapper.onPrepareActionMode(ActionBarSherlockCompat.java:1181)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.actionbarsherlock.internal.app.ActionBarImpl$ActionModeImpl.invalidate(ActionBarImpl.java:713)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.actionbarsherlock.internal.app.ActionBarImpl.startActionMode(ActionBarImpl.java:405)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.actionbarsherlock.internal.ActionBarSherlockCompat.startActionMode(ActionBarSherlockCompat.java:178)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.actionbarsherlock.app.SherlockFragmentActivity.startActionMode(SherlockFragmentActivity.java:50)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.mowdownDevelopments.nagTasks.NagTaskListFragment.onListItemClick(NagTaskListFragment.java:62)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.widget.ListView.performItemClick(ListView.java:3382)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.os.Handler.handleCallback(Handler.java:587)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.os.Handler.dispatchMessage(Handler.java:92)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.os.Looper.loop(Looper.java:123)
06-28 19:49:45.881: E/AndroidRuntime(355): at android.app.ActivityThread.main(ActivityThread.java:4627)
06-28 19:49:45.881: E/AndroidRuntime(355): at java.lang.reflect.Method.invokeNative(Native Method)
06-28 19:49:45.881: E/AndroidRuntime(355): at java.lang.reflect.Method.invoke(Method.java:521)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-28 19:49:45.881: E/AndroidRuntime(355): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-28 19:49:45.881: E/AndroidRuntime(355): at dalvik.system.NativeStart.main(Native Method)
Ce qui souligne le problème étant ici:
public boolean isTaskChecked(long taskID){
SQLiteDatabase db = getReadableDatabase();
String[] columns = {ID, CHECKED};
Cursor c = db.query(TASKS, columns, "_id="+taskID, null, null, null, null);
c.moveToFirst();
int boolAsInt = c.getInt(1); //This line is throwing.
//db.close();
c.close();
if (boolAsInt==1) {
return true;
} else if (boolAsInt==0) {
return false;
} else {
panicButton();
}
return false;
}
Comme le montre l'image, l'exécution de la requête par la BAD retourne très bien. (J'ai utilisé une requête générique là, mais select _id, ischecked from tasks where _id=1;
a bien fonctionné aussi.) Je ne comprends pas pourquoi il est dit que je demande l'index 0 quand le code demande clairement l'index de la colonne 1, et comment la taille est 0 lors de l'exécution du requêtes dans un shell me donne quelque chose qui fonctionne (et n'est pas de taille de base de toute façon?). Quelqu'un peut-il m'aider à déboguer cela? Donc, il se trouve que le problème était que, pour ce problème particulier, c'était que je passais toujours -1 d'une classe différente. Je m'excuse de perdre tout le temps.
J'ai eu cette erreur en utilisant un 'rawquery' qui correspond à la requête SQL dans la question, avec la substitution évidente d'un nombre pour une variable. Je ne devrais pas avoir un ensemble vide. – MowDownJoe