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 :

[SQLite] Erreur Index 0 requested with a size of 0


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 40
    Par défaut [SQLite] Erreur Index 0 requested with a size of 0
    Bonjour,

    Avec SQLite, j'ai créer une base de donnée. Je la stocke avec une méthode dans un tableau. Voici le code :
    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
    public Mesures[] getTabMesures(){
    		String query ="SELECT * FROM "+TABLE_MESURES;
    		//2.get reference to writable DB
    		SQLiteDatabase db=this.getWritableDatabase();
    		Cursor cursor=db.rawQuery(query, null);
    		Mesures[] liste = new Mesures[cursor.getCount()]; 
    		  //si aucun élément n'a été retourné dans la requête, on renvoie null 
    		  if (cursor.getCount() == 0) 
    		  { 
    		   Mesures mesures = new Mesures(); 
    		   return(null); 
    		  } 
    		  else 
    		  { 
    		  //Sinon on se place sur le premier élément 
    		  cursor.moveToFirst(); 
    		  Mesures mesures = new Mesures(); 
    		   for (int i = 0; i < cursor.getCount(); i++)  
    		   { 
    		    mesures.setID(cursor.getString(0)); 
    		    mesures.setLibelle(cursor.getString(1));
    		    mesures.setDescription(cursor.getString(2)); 
    		    liste[i]=mesures; 
    		    cursor.moveToNext(); 
    		   } 
    		   return (liste); 
    		  } 
     
    	}

    J'ai fait une autre méthode pour pouvoir comparer une chaîne avec l'ensemble des id de la base :
    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
    public Mesures getLibelle(String fus){
    		String query ="SELECT Libelle FROM "+TABLE_MESURES+" WHERE id= '"+fus+"'";
    		//2.get reference to writable DB
    		SQLiteDatabase db=this.getWritableDatabase();
    		Cursor cursora=db.rawQuery(query, null);
    		if (cursora!=null)
    			cursora.moveToNext();
    		//4.build mesures object
    		Mesures mesures=new Mesures();
    		mesures.setLibelle(cursora.getString(0));
    		//5.return mesures
    		db.close();
    		return mesures;
     
    	}
    Dans mon code, j'utilise les méthodes ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final Mesures[] a = db.getTabMesures();	
    for(int i=0;i<=a.length;i++){
    	Libelle.setText((CharSequence) db.getLibelle(fus));
    }

    Quand j’exécute mon application, l'erreur écrite dans l'intitulé s'affiche dans le logcat.
    Quelqu'un saurait m'expliquer d'où vient l'erreur? J'ai du faire une erreur dans l'utilisation des méthodes, mais je ne vois pas.
    Je débute en java, la majorité de mon code résulte de morceaux de code trouvés à gauche, à droite sur Internet.

    Merci d'avance de votre compréhension et pour vos réponses!

  2. #2
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Par défaut
    Cette erreur signifie que tu as un tableau non null (donc initialisé), mais sans aucune valeur à l'intérieur, donc vide. Tu demandes l'élément 0 (donc le premier élément) d'un tableau vide (donc sans élément), d'où l'erreur.

    En dehors de ça, tu n'as pas besoin de mettre de parenthèses autour du null dans return(null);. De plus, la ligne d'avant est strictement inutile.
    Il faut éviter de retourner null ou clairement l'indiquer en documentation.

    Pour tes requêtes, passent plutôt par des PreparedStatement, plus sûr et moins enclin aux erreurs.

    Sur quelle ligne est ton erreur ? La cause la plus évidente serait que tu parcours un retour vide de la base.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    moveToFirst te donne déjà des indications:

    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
    32
    33
     
    public Mesures[] getTabMesures() {
        // A SORTIR DE LA FONCTION C'EST UNE CONSTANTE !
        String query ="SELECT * FROM "+TABLE_MESURES;
     
        //2.get reference to writable DB
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor cursor=db.rawQuery(query, null);
     
        // on va utiliser "finally" pour fermer le cursor et la DB !!
        try {
     
            if (!cursor.moveToFirst())
                 return new Mesures[0];
            // il vaut mieux renvoyer un tableau de longueur vide que null (sinon c'est que l'on fait une différence entre les deux).
     
            Mesures[] liste = new Mesures[cursor.getCount()]; 
            //si aucun élément n'a été retourné dans la requête, on renvoie null 
     
            for (int i = 0; (i < cursor.getCount(); ++i) {
                  Mesures mesures = new Mesures();  // c'est un objet différent à chaque fois !!! sinon ca ne marchera pas !
                  mesures.setID(cursor.getString(0)); 
                  mesures.setLibelle(cursor.getString(1));
                  mesures.setDescription(cursor.getString(2)); 
                  liste[i]=mesures; 
                  cursor.moveToNext(); 
             }
             return liste; 
         } finally {
             if (cursor != null) cursor.close();
             if (db != null) db.close(); // <= nécessaire ?
         }
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 40
    Par défaut
    Merci c'est exactement ce que je voulais, et c'est vraiment bien expliquer.
    Maintenant, je voudrais pouvoir parcourir ce tableau et comparer l'id de chaque ligne (la colonne id, pas l'index) avec une variable instanciée plus haut dans mon code afin de récupérer le libellé (deuxième colonne) associé à cet id et le mettre dans un de mes textView. Voici un début de code mais pourriez vous me donner des pistes ou des exemples pour bien réaliser ce code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //J'instancie le tableau dans une variable
    final Mesures[] tabMes = db.getTabMesures();
    //variable "instanciée plus haut dans mon code" à comparer avec l'id
    fus = (gn1+gn2+gn3);
    //Pour parcourir le tableau, j'utilise une boucle for, je ne sais pas si c'est la bonne méthode mais cela semble le plus logique
    for(int i=0;i<=tabMes.length;i++){
          if (fus = tabMes[i]){
          txtViewLibelle.setText(libelle);
    }

    Je suis vraiment pas sur de ma boucle for. La ligne du textView est en quelque sorte du pseudo-code car je ne sais pas comment récupérer le libellé associé à l'id.
    Merci d'avance pour votre aide!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 40
    Par défaut
    Oubliez mon dernier message. J'ai arrêter de vouloir faire un tableau et je vais piocher les infos directement dans ma base de donnée. Mais au final, je me retrouve avec la même erreur. Voici ma 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
    public Mesures getMesuresLib(String fus){
     
     
    		//1.get reference to readable DB
    		SQLiteDatabase db=this.getReadableDatabase();
    		//2.build query
    		Cursor cursor = db.rawQuery("select libelle from "+TABLE_MESURES+" where id=?", new String[]{fus});
    		Mesures mesures;
    		//3.if we got results get the first one
    		try{
    		if (cursor!=null) {
     
    			cursor.moveToFirst();
    			//4.build mesures object
    			mesures=new Mesures();
    			mesures.setLibelle(cursor.getString(0));
    		} else {
    			mesures = null;
    		}
    		//5.return mesures
    		return mesures;
    	}finally{
    		if (cursor!=null)cursor.close();
    	}
    	}
     
    	public Mesures getMesuresLib(int fus){
    		return this.getMesuresLib(String.valueOf(fus));
    	}

    Quand j'ai terminé ce code, il a marché pendant une quinzaine d'essais et au bout d'un moment l'erreur est "apparue".

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (cursor.moveToFirst()) {
        //4.build mesures object
        mesures=new Mesures();
        mesures.setLibelle(cursor.getString(0));
    } else
        mesures = null;
    



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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/11/2011, 18h15
  2. Réponses: 4
    Dernier message: 13/01/2011, 14h03
  3. [D5] [Paradox] Appli reseau erreur: index n'est à jour
    Par sitaleb dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/09/2006, 10h36
  4. [VBA-E] Erreur "Object variable or With block variable not set"
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/06/2006, 12h39
  5. Message d'erreur : Index XSQLDA hors limites
    Par loupiac dans le forum SQL
    Réponses: 2
    Dernier message: 31/12/2005, 09h08

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