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 : Fermeture de curseur


Sujet :

Android

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut Sqlite : Fermeture de curseur
    Bonjour à tous,

    J'ai un souçis avec l'utilisation de Sqlite et notamment au niveau des curseurs.

    J'ai un helper qui gère les intéractions avec ma base de données :

    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
     
    public long add(Groupes grp)
    {
    	ContentValues values = new ContentValues();
    	if(!exist(grp.getLibelle()))
    	{
    		values.put("libelle", grp.getLibelle());
    		return sql.insert(TABLE, null, values);
    	}
    	return -1;
    }
     
    public boolean exist(String nom)
    {
    	Cursor c = sql.rawQuery("SELECT _id FROM groupes WHERE libelle = ?", new String[]{nom});
    	if(c != null)
    	{
    		if(c.getCount() > 0)
    			return true;
    	}
    	c.close();
    	return false;
    }
     
    public void close(){db.close();}
    public void finalize(){if (db!=null) db.close()}
    La méthode exist n'est pas pertinante puisque une condition d'unicité sur la table serait plus adaptée mais c'est pas le pb ici

    Dans mon activity j'ai un événement qui me permet d'écrire dans 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
    16
    17
    18
    19
    20
    21
    22
     
    public void onClick(DialogInterface dialog, int which) {
    	Context ctx = Ajouter.this;
    	String groupe = input.getText().toString();
    	if(groupe.length() > 0)
    	{
    		Groupes grp 			= new Groupes(input.getText().toString());
    		GroupesDBAdapter gDb 	= new GroupesDBAdapter(ctx);
    		int idGrp 				= (int) gDb.add(grp);
    		if(idGrp == -1)
    			Toast.makeText(ctx, R.string.grouperroradd, Toast.LENGTH_SHORT).show();
    		else
    		{
    			grp.setId(idGrp);
    			Toast.makeText(ctx, R.string.groupadded, Toast.LENGTH_SHORT).show();
    			adapter.add(grp);
    		}
     
    		gDb.close();
     
    	}
    }
    J'ai lu un peu partout qu'il était important de fermer les curseur et les connexions à la base dès que possible , ce que je fais (enfin il me semble). J'ai aussi pu lire qu'il fallait dans l'activity utilisé startManagingCursor et stopManagingCursor quand des curseur sont passé à l'activité mais je ne rentre pas dans ce cas , ou alors j'ai mal compris.

    Bref quand je fait un ajout dans la base j'ai une levée d'exception :
    05-27 14:11:50.940: ERROR/Cursor(6137): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
    05-27 14:11:50.940: ERROR/Cursor(6137): at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
    05-27 14:11:50.940: ERROR/Cursor(6137): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
    05-27 14:11:50.940: ERROR/Cursor(6137): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
    05-27 14:11:50.940: ERROR/Cursor(6137): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
    05-27 14:11:50.940: ERROR/Cursor(6137): at pry.pocket.db.GroupesDBAdapter.exist(GroupesDBAdapter.java:88)
    qui si je comprend bien me dis gentiment qu'un curseur est finalisé sans avoir été fermé ...

    Une idée de ce que je fait mal dans ma gestion de ressource ? un db.close() dans le deconstructeur est il suffisant ou dois je fermer ma connexion après chaque requête ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    542
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 542
    Par défaut
    Est-ce que ta requête SQL est correcte car j'ai l'impression que ta table est vide d'après les logs?

    table = null

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Oui la requête est correcte (elle est affiché un peu plus loin dans le message d'erreur) :
    SELECT _id FROM groupes WHERE libelle = ?
    D'ailleurs l'insertion se fait bien , tout comme le vérification d’existence.

    Dans mes extraits de code précédent les ressource sont elles gérées correctement ou pas ? (fermeture de la base et des curseur)
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Par défaut
    En regardant rapidement ce que je vois c'est que le curseur n'est pas fermé si des groupes existent avec le libellé, puisque le "return" est effectué avant la fermeture du curseur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public boolean exist(String nom)
    {
        Cursor c = sql.rawQuery("SELECT _id FROM groupes WHERE libelle = ?", new String[]{nom});
        if(c != null)
        {
            if(c.getCount() > 0)
                return true;// En sortant ici le close ne sera pas fait
        }
        c.close();
        return false;
    }

  5. #5
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    En regardant rapidement ce que je vois c'est que le curseur n'est pas fermé si des groupes existent avec le libellé, puisque le "return" est effectué avant la fermeture du curseur.
    Effectivement c'était une erreur de ce type !
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Fermeture du curseur
    Par bza88 dans le forum Android
    Réponses: 2
    Dernier message: 23/08/2013, 00h03
  2. Fermeture des curseurs
    Par libuma dans le forum Développement Web en Java
    Réponses: 26
    Dernier message: 03/11/2010, 15h50
  3. Fermeture de curseurs - ORA01000
    Par libuma dans le forum PL/SQL
    Réponses: 2
    Dernier message: 29/10/2009, 08h38
  4. Procédure stockée et fermeture du curseur
    Par yrochete dans le forum Hibernate
    Réponses: 0
    Dernier message: 29/01/2009, 16h13
  5. [VBA-E] fermeture de fichier et curseur de souris
    Par thitoux dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/08/2006, 13h17

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