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 :

Erreur Cursor SQLite


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Par défaut Erreur Cursor SQLite
    Bonsoir,

    Ma base de donnee SQLite est composée d'une classe User qui prend 5 attributs String : Age, Sexe, Lieu, Form_set, User_profil_set.

    Dans mon activité de démarrage de l'application j'ai ceci:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    public class SplashScreenActivity extends Activity
    {
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
     
    		// Must be first instruction of onCreate.
    		super.onCreate(savedInstanceState);
     
    		// Show Splash screen.
    		setContentView(R.layout.splash_screen);
     
    		// Starting Internal BDD
    		UserBDD userbdd = new UserBDD(this);
    		userbdd.open();
    		userbdd.removeAllContentUser();
     
    		//check si l'application est cree pour la premiere fois et si oui on cree le premier user en BDD
    		if (userbdd.getUser() == null)
    		{
    			User user_start = new User();
    			userbdd.insertUser(user_start);
    		}
    		final User userfrombdd = userbdd.getUser();
    		userbdd.close();
     
    		// Create and run thread.
    		Thread splashThread = new Thread()
    		{
    			@Override
    			public void run()
    			{
    				try
    				{
    					int waited = 0;
     
    					//while(waited < 5000)
    					while(waited < 500)
    					{
    						sleep(50);
    						waited += 100;
    					}
    				}
    				catch( InterruptedException e )
    				{
    					e.printStackTrace();
    				}
    				finally
    				{
    						// check si la variable form est true ou false -> la personne a soit passee soit validee le formulaire
    					    if (userfrombdd.getForm().equals("true"))
    						{
    							Intent intent_to_main = new Intent(SplashScreenActivity.this, OngletsActivity.class);
    							startActivity(intent_to_main);
    							finish();
    						}
    					    else
    					    {
    							Intent intent_to_pref = new Intent(SplashScreenActivity.this, UserScreen.class);
    							startActivity(intent_to_pref);
    							finish();
    					    }
    				}
    			}
    		};
    		splashThread.start();
    	}
    }
    Mon application marche très bien mais au démarrage j'ai le retour de log Rouge suivant:
    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
    07-18 19:33:56.754: E/Cursor(10763): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.dev.prixo/databases/data.db, table = table_user, query = SELECT SEXE, AGE, QUARTIER, USER_PROFIL, FORM FROM table_user
    07-18 19:33:56.754: E/Cursor(10763): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
    07-18 19:33:56.754: E/Cursor(10763): 	at com.dev.prixo.SQLite.UserBDD.getUser(UserBDD.java:97)
    07-18 19:33:56.754: E/Cursor(10763): 	at com.dev.prixo.SplashScreenActivity.onCreate(SplashScreenActivity.java:32)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.os.Looper.loop(Looper.java:123)
    07-18 19:33:56.754: E/Cursor(10763): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
    07-18 19:33:56.754: E/Cursor(10763): 	at java.lang.reflect.Method.invokeNative(Native Method)
    07-18 19:33:56.754: E/Cursor(10763): 	at java.lang.reflect.Method.invoke(Method.java:521)
    07-18 19:33:56.754: E/Cursor(10763): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    07-18 19:33:56.754: E/Cursor(10763): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    07-18 19:33:56.754: E/Cursor(10763): 	at dalvik.system.NativeStart.main(Native Method)
    Je ferme pourtant bien mon Cursor apres l'avoir cree pour faire mon getUser(), je ne vois vraiment pas , voici le code de ma classe UserBDD:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    public class UserBDD 
    { 
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "data.db";
     
    	private static final String TABLE_USER = "table_user";
     
    	private static final String COL_AGE = "AGE";
    	private static final int NUM_COL_AGE = 0;
     
    	private static final String COL_SEXE = "SEXE";
    	private static final int NUM_COL_SEXE = 1;
     
    	private static final String COL_QUARTIER = "QUARTIER";
    	private static final int NUM_COL_QUARTIER = 2;
     
    	private static final String COL_USER_PROFIL = "USER_PROFIL";
    	private static final int NUM_COL_USER_PROFIL = 3;
     
    	private static final String COL_FORM = "FORM";
    	private static final int NUM_COL_FORM = 4;
     
    	private SQLiteDatabase bdd;
    	private BaseSQLite maBaseSQLite;
     
    	public UserBDD(Context context)
    	{
    		//On créer la BDD et sa table
    		maBaseSQLite = new BaseSQLite(context, NOM_BDD, null, VERSION_BDD);
    	}
     
    	public void open()
    	{
    		//on ouvre la BDD en écriture
    		bdd = maBaseSQLite.getWritableDatabase();
    	}
     
    	public void close()
    	{
    		//on ferme l'accès à la BDD
    		bdd.close();
    	}
     
    	public SQLiteDatabase getBDD()
    	{
    		return bdd;
    	}
     
    	public long insertUser(User user)
    	{
    		//Création d'un ContentValues (fonctionne comme une HashMap)
    		ContentValues values = new ContentValues();
     
    		//on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
    		values.put(COL_SEXE, user.getSexe());
    		values.put(COL_AGE, user.getAge());
    		values.put(COL_QUARTIER, user.getQuartier());
    		values.put(COL_USER_PROFIL, user.getUser_profil());
    		values.put(COL_FORM, user.getForm());
     
    		//on insère l'objet dans la BDD via le ContentValues
    		return bdd.insert(TABLE_USER, null, values);
    	}
     
    	public int updateUser(User user)
    	{
    		ContentValues values = new ContentValues();
    		values.put(COL_SEXE, user.getSexe());
    		values.put(COL_AGE, user.getAge());
    		values.put(COL_QUARTIER, user.getQuartier());
    		values.put(COL_USER_PROFIL, user.getUser_profil());
    		values.put(COL_FORM, user.getForm());
     
    		return bdd.update(TABLE_USER, values, null, null);
    	}
     
    	public int removeAllContentUser()
    	{
    		System.out.println("\nDonnees suprimees.\n");
    		//Suppression des info User
    		return bdd.delete(TABLE_USER, null, null);
    	}
     
    	public User getUser()
    	{
    		Cursor c = bdd.query(TABLE_USER, new String[] {COL_SEXE, COL_AGE, COL_QUARTIER, COL_USER_PROFIL, COL_FORM}, null, null, null, null, null);
     
    		return cursorToUser(c);
    	}
     
    	public String AfficheUserInfo()
    	{
    		Cursor c = bdd.rawQuery("SELECT * FROM table_user", null);
    		String query = c.getString(c.getColumnIndex("SEXE"));
    		c.close();
    		return query;	
    	}
     
    	private User cursorToUser(Cursor c)
    	{
    		//si aucun élément n'a été retourné dans la requête, on renvoie null
    		if (c.getCount() == 0)
    			return null;
     
    		//Sinon on se place sur le premier élément
    		c.moveToFirst();
    		//On créé un livre
    		User user = new User();
     
    		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
    		user.setSexe(c.getString(NUM_COL_SEXE));
    		user.setAge(c.getString(NUM_COL_AGE));
    		user.setQuartier(c.getString(NUM_COL_QUARTIER));
    		user.setUser_profil(c.getString(NUM_COL_USER_PROFIL));
    		user.setForm(c.getString(NUM_COL_FORM));
     
            //On ferme le cursor
    		c.deactivate();
    		c.close();
    		//On retourne le livre
    		return user;
    	}
    }
    Merci de m'aider

  2. #2
    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
    hmmmm....
    Difficile de voir...

    en général on fait cela de toute manière pour éviter les ressources non fermées en cas d'exception:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    User ret;
    Cursor c = null;
    try {
       c = acquireCursor();
       ...
       ret = convertUser(c);
    } finally {
       if (c != null) c.close();
    }
    return ret;
    Pas de catch (on veut remonter l'exception), mais on ferme bien le cursor dans tous les cas (exception ou non).

  3. #3
    Membre confirmé
    Homme Profil pro
    Cisco
    Inscrit en
    Juillet 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Cisco
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 71
    Par défaut
    Probleme resolu, merci.

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

Discussions similaires

  1. Problème cursor SQLite
    Par jojo_ol76 dans le forum Android
    Réponses: 6
    Dernier message: 09/11/2011, 13h45
  2. Cursor SQLite avec variable
    Par JCMANSION dans le forum Android
    Réponses: 5
    Dernier message: 12/01/2011, 15h17
  3. Erreur Syntaxe sqlite
    Par kaizer88 dans le forum C#
    Réponses: 6
    Dernier message: 02/08/2010, 15h55
  4. Erreur cursor ?
    Par Moostiq dans le forum PL/SQL
    Réponses: 3
    Dernier message: 06/01/2010, 12h37
  5. erreur requete SQlite
    Par viking1404 dans le forum SGBD
    Réponses: 3
    Dernier message: 03/05/2009, 23h39

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