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 :

Stockage données SQLite


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut Stockage données SQLite
    Bonjour ,

    je cherche à stocker des données dans une base SQLite , n'ayant jamais fait cette pratique , je me tourne vers vous pour vous demandez des conseils.

    dans mon activité principale j'ai mit :

    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
    		@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);		
    		setContentView(R.layout.activity_exercice);
     
    		// gestion base de donnee
    		//Création d'une instance de ma classe JeuBdd
            JeuBdd exerciceBdd = new JeuBdd(this);
     
            //Création d'un exercice
            ExerciceActivity exercice = new ExerciceActivity(id, nom_exercice);
     
            //On ouvre la base de données pour écrire dedans
            exerciceBdd.open();
            //On insère le exercice que l'on vient de créer
            exerciceBdd.insertExercice(exercice);
     
            //Pour vérifier que l'on a bien créé notre exercice dans la BDD
            //on extrait l exercice de de la BDD grâce a l ID de l exercice que l'on a créé précédemment
            ExerciceActivity exerciceFromBdd = exerciceBdd.getExerciceWithId(exercice.getId());
            //Si un livre est retourné (donc si le livre à bien été ajouté à la BDD)
            if(exerciceFromBdd != null){
            	//On affiche les infos du livre dans un Toast
            	Toast.makeText(this, exerciceFromBdd.toString(), Toast.LENGTH_LONG).show();
            	//On modifie le ID de l'exercice
            	exerciceFromBdd.setId(0);
            	//Puis on met à jour la BDD
                exerciceBdd.updateLivre(exerciceFromBdd.getId(), exerciceFromBdd);
            }
     
            //On extrait l exercice de la BDD grâce au ID
            //S'il existe un exercice possédant cet ID dans la BDD
            if(exerciceFromBdd != null){
    	        //On affiche les nouvelle info de exercice pour vérifié que l exercice a bien été mis à jour
    	        Toast.makeText(this, exerciceFromBdd.toString(), Toast.LENGTH_LONG).show();
    	        //on supprime l exercice de la BDD grâce à son ID
    	    	exerciceBdd.removeExerciceWithID(exerciceFromBdd.getId());
            }
     
            //On essait d'extraire de nouveau l exercice de la BDD toujours grâce à son ID
            exerciceFromBdd = exerciceBdd.getExerciceWithId(exerciceFromBdd.getId());
            //Si aucun livre n'est retourné
            if(exerciceFromBdd == null){
            	//On affiche un message indiquant que l exercice n'existe pas dans la BDD
            	Toast.makeText(this, "Cette exercice n'existe pas dans la BDD", Toast.LENGTH_LONG).show();
            }
            //Si l exercice existe (mais normalement il ne devrait pas)
            else{
            	//on affiche un message indiquant que l exercice existe dans la BDD
            	Toast.makeText(this, "Cet exercice existe dans la BDD", Toast.LENGTH_LONG).show();
            }
     
            exerciceBdd.close();
     
     
    		//fin gestion base de donnee
    Ensuite j'ai créé une classe MaBaseDeDonnée

    contenant 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
    package org.pepimobil;
     
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
     
    public class MaBaseDeDonnee extends SQLiteOpenHelper {
     
    	private static final String TABLE_EXERCICE = "table_exercice";
    	private static final String TABLE_SCORE = "table_score";
    	private static final String COL_ID = "ID";
    	private static final String COL_NOM_EXERCICE = "NomExercice";
    	private static final String COL_ID_EXERCICE = "id_exercice";
    	private static final String SCORE = "value";
    	private static final String DATE = "date";
     
    	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_EXERCICE + " ("+ COL_ID + "INTEGER PRIMARY KEY AUTOINCREMENT, "+ COL_NOM_EXERCICE + " TEXT NOT NULL;)";
    	//private static final String CREATE_BDD2 = "CREATE TABLE " + TABLE_SCORE + " ("+ COL_ID_EXERCICE +"INTEGER DEPEND TABLE_EXERCICE, "+ SCORE +"INTEGER NOT NULL;)";
     
    	public MaBaseDeDonnee(Context context, String name, CursorFactory factory,	int version) {
    		super(context, name, null, version);
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		// TODO Auto-generated method stub
    		db.execSQL(CREATE_BDD);
    		//db.execSQL(CREATE_BDD2);
    	}
     
     
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    Et une derniere class JeuBdd

    Contenant 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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    package org.pepimobil;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
     
    public class JeuBdd {
     
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "score_jeu.db";
     
    	private static final String TABLE_EXERCICE = "table_exercice";
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_NOM_EXERCICE = "EXERCICE 1";
    	private static final int NUM_COL_NOM_EXERCICE = 1;
     
    	private SQLiteDatabase bdd;
     
    	private MaBaseDeDonnee maBaseSQLite;
     
    	public JeuBdd(Context context){
    		//On créer la BDD et sa table
    		maBaseSQLite = new MaBaseDeDonnee(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 insertExercice(ExerciceActivity exercice){
    		//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_ID, exercice.getId());
    		values.put(COL_NOM_EXERCICE, exercice.getNom_exercice());
    		//on insère l'objet dans la BDD via le ContentValues
    		return bdd.insert(TABLE_EXERCICE, null, values);
    	}
     
    	public int updateLivre(int id, ExerciceActivity exercice){
    		//La mise à jour de l exercice dans la BDD fonctionne plus ou moins comme une insertion
    		//il faut simple préciser quelle exercice on doit mettre à jour grâce à l'ID
    		ContentValues values = new ContentValues();
    		values.put(COL_ID, exercice.getId());
    		values.put(COL_NOM_EXERCICE, exercice.getNom_exercice());
    		return bdd.update(TABLE_EXERCICE, values, COL_ID + " = " +id, null);
    	}
     
    	public int removeExerciceWithID(int id){
    		//Suppression d'un exercice de la BDD grâce à l'ID
    		return bdd.delete(TABLE_EXERCICE, COL_ID + " = " +id, null);
    	}
     
    	public ExerciceActivity getExerciceWithId(int id){
    		//Récupère dans un Cursor les valeur correspondant à un exercice contenu dans la BDD (ici on sélectionne le exercice grâce à son id)
    		Cursor c = bdd.query(TABLE_EXERCICE, new String[] {COL_ID, COL_NOM_EXERCICE}, COL_ID + " LIKE \"" + id +"\"", null, null, null, null);
    		return cursorToExercice(c);
    	}
     
    	//Cette méthode permet de convertir un cursor en un exercice
    	private ExerciceActivity cursorToExercice(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 exercice
    		ExerciceActivity exercice = new ExerciceActivity(0, null);
    		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
    		exercice.setId(c.getInt(NUM_COL_ID));
    		exercice.setNom_exercice(c.getString(NUM_COL_NOM_EXERCICE));
    		//On ferme le cursor
    		c.close();
     
    		//On retourne le exercice
    		return exercice;
    	}
    }
    Hors ça ne fonctionne pas , aurais-je passé à coté de quelquechose ?

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2011
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2011
    Messages : 67
    Points : 87
    Points
    87
    Par défaut
    Qu'entends tu par ça ne fonctionne pas ? Je n'ai pas envie de passer tout le code en revue inutilement, donc si tu as une Stacktrace, donne là nous ça ira plus vite :-)

    Lionel

    PS: Je ne sais pas si tu as déjà lu ça : http://www.vogella.com/articles/Andr...e/article.html , mais c'est assez intéressant.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Janvier 2003
    Messages : 72
    Points : 51
    Points
    51
    Par défaut
    Je sais pas si c'est ça mais le nom des colonnes avec des espaces, par principe j'évite, on sait jamais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	private static final String COL_NOM_EXERCICE = "EXERCICE 1";
    Sinon ton code (à première vue) à l'air correct, passe ta base en version 2 pour la regénérer, peut-être que des bugs persistent de tes premières compilations.

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Voici le log quand je compile :

    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
    11-15 09:49:57.432: W/dalvikvm(418): threadid=1: thread exiting with uncaught exception (group=0x40014760)
    11-15 09:49:57.442: E/AndroidRuntime(418): FATAL EXCEPTION: main
    11-15 09:49:57.442: E/AndroidRuntime(418): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.pepimobil/org.pepimobil.ExerciceActivity}: java.lang.InstantiationException: org.pepimobil.ExerciceActivity
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1739)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread.access$500(ActivityThread.java:122)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.os.Looper.loop(Looper.java:132)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread.main(ActivityThread.java:4123)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at java.lang.reflect.Method.invokeNative(Native Method)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at java.lang.reflect.Method.invoke(Method.java:491)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at dalvik.system.NativeStart.main(Native Method)
    11-15 09:49:57.442: E/AndroidRuntime(418): Caused by: java.lang.InstantiationException: org.pepimobil.ExerciceActivity
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at java.lang.Class.newInstanceImpl(Native Method)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at java.lang.Class.newInstance(Class.java:1301)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1730)
    11-15 09:49:57.442: E/AndroidRuntime(418): 	... 11 more

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Booyakha , j'ai enlevé les espaces et remplacer par "_" , et passé en version 2 mais ça ne change rien j'ai toujours l'erreur dans le log au dessus.

  6. #6
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Bon je pense pour faire plus simple , de partir sur un exemple de ce que je cherche à faire , je compte sur vous pour me guider en chemin.

    J'établie juste le début d'une création de base de donnée.
    L'objectif étant de créer la base , d'y mettre un champ ID auto increment, et un champ stockant le nom de l'exercice.

    Je pense que jusque là vue le code que je vous présente en dessous ça semble correct ...

    Class MainActivity :

    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
    package com.example.testbase;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
     
    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
     
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }
    Class MyDatabase :

    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
    package com.example.testbase;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
     
    public class MyDatabase extends SQLiteOpenHelper {
    	public static final String EXERCICE_KEY = "id";
    	public static final String EXERCICE_NOM = "nomExercice";
    	public static final String EXERCICE_TABLE_NAME = "Exercice";
     
    	public static final String EXERCICE_TABLE_CREATE =
    		    "CREATE TABLE " + EXERCICE_TABLE_NAME + " (" +
    		     EXERCICE_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    		      EXERCICE_NOM + " TEXT);";
     
     
    	public MyDatabase ( Context context , String name , CursorFactory factory ,
    			int version ) {
    		super ( context , name , factory , version );
    	}
    	public void onCreate ( SQLiteDatabase db ) {
    		db.execSQL(EXERCICE_TABLE_CREATE);
    	}
     
    	public static final String EXERCICE_TABLE_DROP = "DROP TABLE IF EXISTS " + EXERCICE_TABLE_NAME + ";";
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    	  db.execSQL(EXERCICE_TABLE_DROP);
    	  onCreate(db);
    	}
     
    }
    Class Exercice :

    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
    package com.example.testbase;
     
    public class Exercice {
     
    	private long id;
    	private String nomExercice;
     
    	public Exercice(long id, String nomExercice) {
    		super();
    		this.id = id;
    		this.nomExercice = nomExercice;
    	}
     
    	public long getId() {
    		return id;
    	}
     
    	public void setId(long id) {
    		this.id = id;
    	}
     
    	public String getNomExercice() {
    		return nomExercice;
    	}
     
    	public void setNomExercice(String nomExercice) {
    		this.nomExercice = nomExercice;
    	}
     
    }
    Maintenant je vois pas trop la suite pour Ajouter un enregistrement , afficher la liste des enregistrements etc ...


    Je bloque à ce niveau.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Rebonjour après avoir bossé un peu dessus et éclaircis certain point dans mon esprit ... lol

    j'ai toujours une erreur mais cette fois je pense que ça concerne SQLite.

    je vous joins les sources ainsi que les logs erreur

    Mon activity_main :

    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
    package com.example.testbase;
     
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.widget.Toast;
     
    public class MainActivity extends Activity {
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            //Création d'une instance de ma classe ExerciceBDD
            ExerciceBDD exerciceBdd = new ExerciceBDD(this);
     
            //Création d'un exercice
            Exercice exercice = new Exercice(1, "exercice Chiffre - Lettre");
     
            //On ouvre la base de données pour écrire dedans
            exerciceBdd.open();
            //On insère l'exercice que l'on vient de créer
            exerciceBdd.insertExercice(exercice);
     
            //Pour vérifier que l'on a bien créé notre exercice dans la BDD
            //on extrait l'exercice de la BDD grâce au nom de l'exercice que l'on a créé précédemment
            Exercice exerciceFromBdd = exerciceBdd.getExerciceWithNom(exercice.getNomExercice());
            //Si un exercice est retourné (donc si l'exercice à bien été ajouté à la BDD)
            if(exerciceFromBdd != null){
            	//On affiche les infos de l'exercice dans un Toast
            	Toast.makeText(this, exerciceFromBdd.toString(), Toast.LENGTH_LONG).show();
            	//On modifie le nom de l'exercice
            	exerciceFromBdd.setNomExercice("Nouveau nom de l'exercice");
            	//Puis on met à jour la BDD
                exerciceBdd.updateExercice(exerciceFromBdd.getId(), exerciceFromBdd);
            }
     
            //On extrait l'exercice de la BDD grâce au nouveau nom
            exerciceFromBdd = exerciceBdd.getExerciceWithNom("J'ai modifié le titre du livre");
            //S'il existe un exercice possédant ce nom dans la BDD
            if(exerciceFromBdd != null){
    	        //On affiche les nouvelles informations de l'exercice pour vérifier que le nom de l'exercice a bien été mis à jour
    	        Toast.makeText(this, exerciceFromBdd.toString(), Toast.LENGTH_LONG).show();
    	        //on supprime l'exercice de la BDD grâce à son ID
    	    	exerciceBdd.removeExerciceWithID(exerciceFromBdd.getId());
            }
     
            //On essaye d'extraire de nouveau exercice de la BDD toujours grâce à son nouveau nom
            exerciceFromBdd = exerciceBdd.getExerciceWithNom("J'ai modifié le titre du livre");
            //Si aucun exercice n'est retourné
            if(exerciceFromBdd == null){
            	//On affiche un message indiquant que l'exercice n'existe pas dans la BDD
            	Toast.makeText(this, "Cet exercice n'existe pas dans la BDD", Toast.LENGTH_LONG).show();
            }
            //Si l'exercice existe (mais normalement il ne devrait pas)
            else{
            	//on affiche un message indiquant que l'exercice existe dans la BDD
            	Toast.makeText(this, "Cet exercice existe dans la BDD", Toast.LENGTH_LONG).show();
            }
     
            exerciceBdd.close();
        }
    }
    Ma class MyDatabase :

    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
    package com.example.testbase;
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
     
    public class MyDatabase extends SQLiteOpenHelper {
    	public static final String EXERCICE_KEY = "id";
    	public static final String EXERCICE_NOM = "nomExercice";
    	public static final String EXERCICE_TABLE_NAME = "Exercice";
     
    	public static final String EXERCICE_TABLE_CREATE =
    		    "CREATE TABLE " + EXERCICE_TABLE_NAME + " (" +
    		     EXERCICE_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    		      EXERCICE_NOM + " TEXT);";
     
     
    	public MyDatabase ( Context context , String name , CursorFactory factory ,
    			int version ) {
    		super ( context , name , factory , version );
    	}
    	public void onCreate ( SQLiteDatabase db ) {
    		db.execSQL(EXERCICE_TABLE_CREATE);
    	}
     
    	public static final String EXERCICE_TABLE_DROP = "DROP TABLE IF EXISTS " + EXERCICE_TABLE_NAME + ";";	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    	  db.execSQL(EXERCICE_TABLE_DROP);
    	  onCreate(db);
    	}
     
    }
    Ma class ExerciceBDD :

    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
    package com.example.testbase;
     
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
     
    public class ExerciceBDD {
     
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "exercices.db";
     
    	private static final String EXERCICE_TABLE_NAME = "Exercice";
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_NOM = "NOM";
    	private static final int NUM_COL_NOM = 1;
    //	private static final String COL_TITRE = "Titre";
    //	private static final int NUM_COL_TITRE = 2;
     
    	private SQLiteDatabase bdd;
     
    	private MyDatabase maBaseSQLite;
     
    	public ExerciceBDD(Context context){
    		//On crée la BDD et sa table
    		maBaseSQLite = new MyDatabase(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 insertExercice(Exercice exercice){
    		//Création d'un ContentValues (fonctionne comme une HashMap)
    		ContentValues values = new ContentValues();
    		//on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
    		values.put(COL_ID, exercice.getId());
    		values.put(COL_NOM, exercice.getNomExercice());
    		//on insère l'objet dans la BDD via le ContentValues
    		return bdd.insert(EXERCICE_TABLE_NAME, null, values);
    	}
     
    	public int updateExercice(long l, Exercice exercice){
    		//La mise à jour d'un livre dans la BDD fonctionne plus ou moins comme une insertion
    		//il faut simplement préciser quel livre on doit mettre à jour grâce à l'ID
    		ContentValues values = new ContentValues();
    		values.put(COL_ID, exercice.getId());
    		values.put(COL_NOM, exercice.getNomExercice());
    		return bdd.update(EXERCICE_TABLE_NAME, values, COL_ID + " = " +l, null);
    	}
     
    	public int removeExerciceWithID(long l){
    		//Suppression d'un livre de la BDD grâce à l'ID
    		return bdd.delete(EXERCICE_TABLE_NAME, COL_ID + " = " +l, null);
    	}
     
    	public Exercice getExerciceWithNom(String NOM){
    		//Récupère dans un Cursor les valeurs correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
    		Cursor c = bdd.query(EXERCICE_TABLE_NAME, new String[] {COL_ID, COL_NOM}, COL_NOM + " LIKE \"" + NOM +"\"", null, null, null, null);
    		return cursorToExercice(c);
    	}
     
    	//Cette méthode permet de convertir un cursor en un livre
    	private Exercice cursorToExercice(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
    		Exercice exercice = new Exercice(0, null);
    		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
    		exercice.setId(c.getInt(NUM_COL_ID));
    		exercice.setNomExercice(c.getString(NUM_COL_NOM));
    		//On ferme le cursor
    		c.close();
     
    		//On retourne le livre
    		return exercice;
    	}
    }
    Ma class Exercice :

    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
    package com.example.testbase;
     
    public class Exercice {
     
    	private long id;
    	private String nomExercice;
     
    	public Exercice(long id, String nomExercice) {
    		super();
    		this.id = id;
    		this.nomExercice = nomExercice;
    	}
     
    	public long getId() {
    		return id;
    	}
     
    	public void setId(long id) {
    		this.id = id;
    	}
     
    	public String getNomExercice() {
    		return nomExercice;
    	}
     
    	public void setNomExercice(String nomExercice) {
    		this.nomExercice = nomExercice;
    	}
     
    }
    Et enfin mon erreur :

    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
    11-15 17:27:58.848: E/AndroidRuntime(528): FATAL EXCEPTION: main
    11-15 17:27:58.848: E/AndroidRuntime(528): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.testbase/com.example.testbase.MainActivity}: android.database.sqlite.SQLiteException: no such column: NOM: , while compiling: SELECT ID, NOM FROM Exercice WHERE NOM LIKE "exercice Chiffre - Lettre"
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread.access$500(ActivityThread.java:122)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.os.Looper.loop(Looper.java:132)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread.main(ActivityThread.java:4123)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at java.lang.reflect.Method.invokeNative(Native Method)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at java.lang.reflect.Method.invoke(Method.java:491)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at dalvik.system.NativeStart.main(Native Method)
    11-15 17:27:58.848: E/AndroidRuntime(528): Caused by: android.database.sqlite.SQLiteException: no such column: NOM: , while compiling: SELECT ID, NOM FROM Exercice WHERE NOM LIKE "exercice Chiffre - Lettre"
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:146)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:367)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:130)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1539)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1419)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1375)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1455)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at com.example.testbase.ExerciceBDD.getExerciceWithNom(ExerciceBDD.java:71)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at com.example.testbase.MainActivity.onCreate(MainActivity.java:29)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.Activity.performCreate(Activity.java:4397)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779)
    11-15 17:27:58.848: E/AndroidRuntime(528): 	... 11 more

  8. #8
    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
    Dans "MyDatabase":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public static final String EXERCICE_KEY = "id";
    	public static final String EXERCICE_NOM = "nomExercice";
    	public static final String EXERCICE_TABLE_NAME = "Exercice";
     
    	public static final String EXERCICE_TABLE_CREATE =
    		    "CREATE TABLE " + EXERCICE_TABLE_NAME + " (" +
    		     EXERCICE_KEY + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
    		      EXERCICE_NOM + " TEXT);";
    Dans "ExerciceBDD "
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	private static final String NOM_BDD = "exercices.db";
     
    	private static final String EXERCICE_TABLE_NAME = "Exercice";
    	private static final String COL_ID = "ID";
    	private static final int NUM_COL_ID = 0;
    	private static final String COL_NOM = "NOM";
    	private static final int NUM_COL_NOM = 1;
    Il y a un seul et unique intérêt à utiliser des constantes: NE PAS LES REDÉFINIR PLUSIEURS FOIS ET EVITER DE SE GOURER !

    NOM_BDD n'a rien à faire dans ExerciceBDD... il devrait être défini dans MyDatabase

    Les champs EXERCICE_xxxx n'ont rien à faire dans MyDatabase, il devraient être (ils y sont déjà presque tous, sauf le code de create) dans ExerciceBDD
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    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
    Au fait, au passage, un petit truc que les 238723 de tutos légers trouvables sur Internet n'utilisent jamais:

    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
     
    class ExerciceDAO  // en général on appelle "DAO" cette classe là:
    {
         public static final String TABLE = "";
         // vive Java5 !
         public static enum Columns {
              ID,
              NOM
         }
     
         private static final String[] COLUMNS = enumNameToStringArray(Columns.values());
     
         public long insertExercice(Exercice exercice){
    		ContentValues values = new ContentValues();
    		values.put(Columns.ID.name(), exercice.getId());
    		values.put(Columns.NOM.name(), exercice.getNomExercice());
    		return bdd.insert(TABLE , null, values);
          }
     
          // c'est quoi le code de cursor management ici ? Il n'a rien à faire là !
          private Exercice cursorToExercice(Cursor c){
                    // toujours créer un constructeur par défaut....
                    // (plus facile justement pour gérer les valeurs par défaut que d'aller dans le DAO)
    		Exercice exercice = new Exercice();
    		exercice.setId(c.getInt(Columns.ID.ordinal()));
    		exercice.setNomExercice(c.getString(Columns.NOM.ordinal())));
    		//On retourne le livre
    		return exercice;
    	}
     
     
           // ATTENTION les variables ne doivent jamais commencer par une majuscule... ici risque de "hider" la constante en plus !
           public Exercice getExerciceWithNom(String vnom){
    		// ouvre un cursor:
    		Cursor c = bdd.query(TABLE, COLUMNS , Columns.NOM + " LIKE \"" + vnom+"\"", null, null, null, null);
                    // ET LE PROTEGE !
                    try {
                         if (c.moveToFirst())
    	                 return cursorToExercice(c);
                    } finally {
                         c.close();
                    }
    	}
     
            public List<Exercice> listExerciceWithNom(String vnom) {
                    ArrayList<Exercice> ret = new ArrayList<Exercice>(); 
                    // ouvre un cursor:
    		Cursor c = bdd.query(TABLE, COLUMNS , Columns.NOM + " LIKE \"" + vnom+"\"", null, null, null, null);
                    // ET LE PROTEGE !
                    try {
                        boolean hasMore = c.moveToFirst();
                        while (hasMore) {
                              list.add(cursorToExercice(c));
                              hasMore = c.moveToNext();
                        }
                    } finally {
                         c.close();
                    }
                    return ret;
            }
     
    }
    Manque juste la fonction "enumToStringArray" à coller dans une classe utilitaire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static <T extends Enum<T>> String[] enumNameToStringArray(T[] values) {  
        int i = 0;  
        String[] result = new String[values.length];  
        for (T value: values)
            result[i++] = value.name();  
        return result;  
    }
    L'interêt... il suffit de rajouter une entrée dans le enum pour que tout soit géré correctement....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 277
    Points : 126
    Points
    126
    Par défaut
    Merci à toi encore une fois pour tes conseils ainsi que tes exemples de code. N'ayant eu que peu d'information en formation (un simple pdf donnée à la volé) . La structuration expliqué n'était pas du tout là même que toi , les requête sql par exemple ne passaient pas par des constanstes , le code un peu n'importe où.

    Bref merci de m'avoir éclaircit pour la base de donnée.

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

Discussions similaires

  1. [PDO] Représentation des données sqlite sous forme de tableau HTML
    Par boulamite dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/06/2008, 18h45
  2. Classe de gestion de base de données SQLITE
    Par Munkey74 dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 1
    Dernier message: 09/08/2007, 16h50
  3. Hashage & Optimisation stockage données
    Par white_angel_22 dans le forum Langage
    Réponses: 2
    Dernier message: 11/04/2007, 23h20
  4. Stockage données de type inconnu
    Par jmartell dans le forum Administration
    Réponses: 3
    Dernier message: 06/06/2006, 14h49

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