2012-07-12 5 views
0

Apologies to those with bandwidth problems.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.

Répondre

3

Faites ceci:

if(c.moveToFirst()){ 
    int boolAsInt = c.getInt(1); 
} 

Le curseur peut être vide, de sorte que vous devez vérifier avant d'essayer d'obtenir des valeurs de celle-ci. MoveToFirst() renvoie la valeur false si le curseur est vide, de sorte que if ne sera pas saisi et que vous n'obtiendrez plus l'exception

La raison pour laquelle les curseurs sont vides est que la requête SQL a renvoyé un jeu de résultats vide. Si vous êtes sûr que vous devriez avoir un ensemble non vide, vérifiez à nouveau la requête.

+0

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

0

paramètre de la méthode de getInt est l'indice, donc si vous essayez d'obtenir la première colonne de la requête, vous devez mettre 0.

Questions connexes