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

  1. #1
    Membre du Club
    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
    Points : 55
    Points
    55
    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 éminent

    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
    Points : 7 618
    Points
    7 618
    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).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre du Club
    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
    Points : 55
    Points
    55
    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