Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur difficile a resoudre

SQLITE

    19 juin 2013 à 15:05:41

    salut a tous . sa fait presque deux jours que je ne parviens pas a resoudre le probleme ci-dessous . SVP  veuillez m’éclairer :

    06-19 13:50:26.705: E/CursorWindow(1950): need to grow: mSize = 1048576, size = 81, freeSpace() = 14, numRows = 9239
    06-19 13:50:26.705: E/CursorWindow(1950): not growing since there are already 9239 row(s), max size 1048576
    06-19 13:50:26.705: E/CursorWindow(1950): The row failed, so back out the new row accounting from allocRowSlot 9238
    06-19 13:50:26.705: E/Cursor(1950): Failed allocating fieldDir at startPos 0 row 9238
    

    cette erreur se produit lorsque j'essaie de selectionner les donnees sauvegardees dans une base de donnee SQLITE.

    voici ma méthode de sélection des données en base  :

     public List<Coordonnees> getAllCord() {
            List<Coordonnees> coordList = new ArrayList<Coordonnees>();
            // Select All Query
            String selectQuery = "SELECT  * FROM " + CoordonneesOpenHelper.COORDONNEES_TABLE_NAME;
     
            this.maBDD = sqLiteOpenHelper.getWritableDatabase();
            Cursor cursor = maBDD.rawQuery(selectQuery, null);
     
            // looping through all rows and adding to list
            if (cursor.moveToFirst()) {
                do {
                	Coordonnees cod = new Coordonnees() ;
                	cod.setId(cursor.getInt(CoordonneesOpenHelper.NUM_COLUMN_ID));
            		cod.setLatitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_LATITUDE));
            		cod.setLongitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_LONGITUDE));
            		cod.setAltitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_ALTITUDE));
            		cod.setPrecision(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_PRECISION));
            		cod.setVitesse(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_VITESSE));
            		cod.setFournisseur(cursor.getString(CoordonneesOpenHelper.NUM_COLUMN_FOURNISSEUR));
            		cod.setDirection(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_DIRECTION));
            		cod.setDate(cursor.getString(CoordonneesOpenHelper.NUM_COLUMN_DATE));
            		
                    coordList.add(cod);
                } while (cursor.moveToNext());
                cursor.close() ;
            }




    • Partager sur Facebook
    • Partager sur Twitter
    A Vaincre sans péril on finit par triompher sans gloire  ->  le Cid de corneille
      19 juin 2013 à 16:53:22

      salut, en fait tu n'as pas de problème dans ton code. Ton problème est du au faite que lorsque tu fais un "select *" tu charges une très grosse quantité de données.
      La ligne  

      CursorWindow(1950): not growing since there are already 9239 row(s), max size 1048576

      t'indique que la mémoire est chargée au maximum. En fait il ne s'agit pas de la mémoire du tas en elle même mais uniquement de la taille maximal qu'un cursor (CursorWindow) peut contenir.

      La solution est de faire une requete en plusieurs morceaux, en limitant le nombre de lignes.

      Ensuite tu peux chercher du coté de CursorJoiner pour rassembler les différents cursors. Mais attention, la je ne connait pas la limite de taille d'un CursorJoiner. Le plus simple serais peut être de travailler avec plusieurs cursor en les mettant dans une List de Cursor comme ceci:
       

             List<Cursor> cursorList = new ArrayList<Cursor>();
             cursorList.add(maBDD.rawQuery(selectQuery1, null)); //selecteQueryX limite le nombre de ligne
             cursorList.add(maBDD.rawQuery(selectQuery2, null));
             cursorList.add(maBDD.rawQuery(selectQuery3, null));
       
             for(Cursor cursor:cursorList)
                 if (cursor.moveToFirst()) {
                     do {
                         Coordonnees cod = new Coordonnees() ;
                         cod.setId(cursor.getInt(CoordonneesOpenHelper.NUM_COLUMN_ID));
                         cod.setLatitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_LATITUDE));
                         cod.setLongitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_LONGITUDE));
                         cod.setAltitude(cursor.getDouble(CoordonneesOpenHelper.NUM_COLUMN_ALTITUDE));
                         cod.setPrecision(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_PRECISION));
                         cod.setVitesse(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_VITESSE));
                         cod.setFournisseur(cursor.getString(CoordonneesOpenHelper.NUM_COLUMN_FOURNISSEUR));
                         cod.setDirection(cursor.getFloat(CoordonneesOpenHelper.NUM_COLUMN_DIRECTION));
                         cod.setDate(cursor.getString(CoordonneesOpenHelper.NUM_COLUMN_DATE));                
                         coordList.add(cod);
                     } while (cursor.moveToNext());
                     cursor.close() ;
                 }

      J'espère que ça va t'aider.

      Edit: Je viens de voir le la doc de google propose un exemple pour CursorJoiner



      -
      Edité par freetibet 19 juin 2013 à 17:04:52

      • Partager sur Facebook
      • Partager sur Twitter

      Erreur difficile a resoudre

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown