IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Cursor index outOfBoundexception


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 25
    Points
    25
    Par défaut Cursor index outOfBoundexception
    Bonjour,

    Dans ma persistance, j'ai un objet "utilisateur" et dans cette objet j'ai une variable "int etat". Pour changer la valeur de etat dans ma BDD j'utilise
    cette méthode avec en parametre idUtilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    //methode changement etat utilisateur 
        public void InsertEtatUtilisateur(Utilisateur utilisateur){
        	db = database.getWritableDatabase();
        	ContentValues values = new ContentValues();
        	values.put(" COL_ETAT ",1);
            db.update(BDD.TABLE_UTILISATEURS, values, " COL_ID = " + Integer.toString(utilisateur.getIdUtilisateur()) , null);
            lectureEtatUtilisateur(utilisateur);
            db.close();
        }
    //control de ma valeur etat
        private void lectureEtatUtilisateur(Utilisateur utilisateur){
        	String query = "SELECT COL_ETAT FROM " + BDD.TABLE_UTILISATEURS + " WHERE COL_ID = " + utilisateur.getIdUtilisateur();
        	Cursor mCursor = ExecuteQuery(query,null);	
        		System.out.println("valeur etat = " + mCursor.getLong(mCursor.getColumnIndex("COL_ETAT")));
        }
    Dans la partie lectureEtatUtilisateur je contrôle si etat a bien changé sa valeur. Jusqu'ici tout va bien ça marche.

    Maintenant je veux faire l'inverse, extraire l'id de l'utilisateur ou etat = 1,
    et j'utilise cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     public Cursor SelectUtilisateurEtat(){
       	int etat = 1;
       	String Query = " SELECT COL_ID FROM " + BDD.TABLE_UTILISATEURS + " WHERE COL_ETAT = " + etat;
    	Cursor mCursor = ExecuteQuery(Query,null);  
     
      //ici le programme plante
        System.out.println("valeur col_id : "+ mCursor.getLong(mCursor.getColumnIndex(" COL_ID ")));
     
       	return mCursor;
       }
    Mais ça plante, le LogCat me dit que mon cursor n'est pas à la bonne position, j'ai utilisé curor.moveToFirst et cela ne fonctionne pas. Et la franchement je ne voie pas mon erreur.

    voici le LogCat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    08-14 21:03:22.706: E/AndroidRuntime(968): Uncaught handler: thread main exiting due to uncaught exception
    08-14 21:03:22.766: E/AndroidRuntime(968): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.virtualbudget/com.virtualbudget.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.os.Looper.loop(Looper.java:123)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread.main(ActivityThread.java:4363)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at java.lang.reflect.Method.invokeNative(Native Method)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at java.lang.reflect.Method.invoke(Method.java:521)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at dalvik.system.NativeStart.main(Native Method)
    08-14 21:03:22.766: E/AndroidRuntime(968): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:99)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at Persistance.DBAdapter.SelectUtilisateurEtat(DBAdapter.java:177)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at com.virtualbudget.MainActivity.ControlEtat(MainActivity.java:267)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at com.virtualbudget.MainActivity.onCreate(MainActivity.java:117)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
    08-14 21:03:22.766: E/AndroidRuntime(968): 	... 11 more
    08-14 21:03:22.826: I/dalvikvm(968): threadid=7: reacting to signal 3
    08-14 21:03:22.826: I/dalvikvm(968): Wrote stack trace to '/data/anr/traces.txt'
    08-14 21:08:22.879: I/Process(968): Sending signal. PID: 968 SIG: 9
    Merci pour votre aide !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Je fais plus simple, je met tout dans la même méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     //methode changement etat utilisateur 
        public void InsertEtatUtilisateur(Utilisateur utilisateur){
        	db = database.getWritableDatabase();
            //COL_ETAT = 1 pour l'utilisateur_id = 1
        	ContentValues values = new ContentValues();
        	values.put(" COL_ETAT ",1);
            db.update(BDD.TABLE_UTILISATEURS, values, " COL_ID = " + Integer.toString(utilisateur.getIdUtilisateur()) , null);
            lectureEtatUtilisateur(utilisateur);
            testIdUtilisateur();
            db.close();
        }
        //controler si etat utilisateur = 1
        private void lectureEtatUtilisateur(Utilisateur utilisateur){
        	String query = "SELECT COL_ETAT FROM " + BDD.TABLE_UTILISATEURS + " WHERE COL_ID = " + utilisateur.getIdUtilisateur();
        	Cursor mCursor = ExecuteQuery(query,null);
     
        		System.out.println("valeur etat = " + mCursor.getLong(mCursor.getColumnIndex("COL_ETAT")));//Ok
     
        }
    //obtenir l'id_utilisateur ou etat = 1
        private void testIdUtilisateur(){
        	long etat = 1;
           	String Query = " SELECT COL_ID FROM " + BDD.TABLE_UTILISATEURS + " WHERE COL_ETAT = " + etat;
        	Cursor mCursor = ExecuteQuery(Query,null);
     
        	System.out.println("BUG");
     
            System.out.println("valeur col_id : "+ mCursor.getLong(mCursor.getColumnIndex(" COL_ID ")));
     
        }
    message LogCat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bad request for field slot 0,-1 ligne 1 colonne 1
    pourquoi il ne prend pas ma valeur ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Je me suis dépanné en donnant le numéro de ma colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("valeur col_id : "+ cursor.getInt(0));
    Mais je ne comprends toujours pas pourquoi il prend la colonne 1 à la place de la colonne 0.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Avant d'executer ma requête (SELECT), je demande la lecture de la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     db = database.getReadableDatabase();

  5. #5
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Salut,

    Déjà vire les espaces ca sert à rien..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("valeur col_id : "+ mCursor.getLong(mCursor.getColumnIndex(" COL_ID ")));
    Ensuite a quoi correspond ces noms de colonne ?

    On peut voir comment tu créer ta table ?


    Deuxièment avant de récupérer une valeur d'une colonne on regarde toujours si le cursor est bien remplit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cursor != null && cursor.moveToFirst()
    Merci.
    Responsable Android de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Android, consulter la page cours
    N'hésitez pas à consulter la FAQ Android et à poser vos questions sur les forums d'entraide mobile d'Android.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cursor index handle error
    Par twilight lover dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/12/2009, 09h02
  2. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  3. Index n'est pas a jour
    Par touhami dans le forum Paradox
    Réponses: 5
    Dernier message: 11/12/2002, 14h47
  4. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo