• Développez une application pour android etape 5 (Connexion à la base de données sqlite)

    Publié le 02 avril 2009 par Guy (GuyTouch)


    Dans mes posts précédent j’ai mis en place un formulaire d’enregistrement d’une recette

    Maintenant que j’ai mon formulaire je dois sauvegarde les informations saisies, android embarque une base de données sqlite trés proche de mysql je vais donc utiliser cette base.

    je vais avant de commence parler (vite fait) de la structure de ma base de données. J’ai une table recette_larecette, une table recette_condiment et une table recette_contenu,chaque ingrédient est indexé dans la table recette_condiment et la table recette_contenu permet de lier les ingrédients à la recette.

    android52

    Je vais développer une classe qui vas être dédié uniquement à gérer mes actions sur ma bdd. Pour créer ma nouvelle classe, dans eclipse il faut ouvrir l’aborescence src et sur le package bouton droit->new->class. Pour mon exemple j’appelle ma classe BDAcces

    android51

    j’obtiens donc ce code
    package com.example.testrecette;

    public class BdAcessV1 {

    }
    Je rajoute des attributs static dans lesquelles je mets le nom de ma base, le nom de mes tables ainsi que mes différentes requêtes de création.

    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
    
    //  variable  bdd
    private static final String RECETTE_TABLE = "recette_larecette";
    private static final String INGREDIENT_RECETTE_TABLE = "recette_contenu";
    private static final String INGREDIENT_TABLE = "recette_condiment";
     
    private static final String DATABASE_NAME = "recette_android";
     
    private static final int DATABASE_VERSION = 1;
     
    //requete creation bdd
    private static final String CREATE_RECETTE_TABLE ="CREATE TABLE recette_larecette ("
    +"id_larecette BIGINT PRIMARY KEY  AUTOINCREMENT,"
    +"id_user INTEGER(11) NOT NULL,"
    +"id_pays INTEGER UNSIGNED NOT NULL,"
    +"id_typerepas INTEGER UNSIGNED NOT NULL,"
    +"nom_larecette VARCHAR(250) NOT NULL,"
    +"supplogique_larecette VARCHAR(10) NOT NULL,"
    +"recette_larecette LONGTEXT NOT NULL,"
    +"nbrpers_larecette INTEGER UNSIGNED NOT NULL,"
    +"dateenreg_larecette DATETIME NOT NULL,"
    +"nbrcalories_larecette INTEGER UNSIGNED NOT NULL,"
    +"liensite_enreg LONGTEXT NOT NULL"
    +")";
     
    private static final String CREATE_RECETTE_CONTENU ="CREATE TABLE recette_contenu ("
    +"id_contenu BIGINT PRIMARY KEY AUTOINCREMENT,"
    +"id_unitemesure INT NOT NULL,"
    +"id_larecette BIGINT NOT NULL,"
    +"id_condiment BIGINT NOT NULL,"
    +"nombre_contenu DECIMAL NOT NULL,"
    +"unitemesure_contenu VARCHAR(20) NULL"
    +")";
     
    private static final String CREATE_RECETTE_CONDIMENT ="CREATE TABLE recette_condiment ("
    +"id_condiment BIGINT PRIMARY KEY  AUTOINCREMENT,"
    +"id_typealiment INTEGER UNSIGNED NOT NULL,"
    +"nom_condiment VARCHAR(250) NOT NULL,"
    +"mesure_condiment VARCHAR(100) NOT NULL,"
    +"supplogique_condiment VARCHAR(10) NOT NULL '"
    +")";
    //Faire attention à la création d'une tables sous sqlite la formulation des requetes est un peu différente de celle en mysql 
     
    //je rajoute également trois attributs
    private final Context mCtx; 
    //contient les information sur l'environnement de mon application
    //class permettant de manager la creation,et la mise à jur de notre base
    public BDAcces(Context ctx) {
     
    		 this.mCtx = ctx;
    	 }
    private DatabaseHelper mDbHelper;
    //class d'action sur notre base
    private SQLiteDatabase mDb;
    private static final String TAG = "BDAcces";
    J'ai vais maintenant créer ma classe DatabaseHelper qui est une extension de <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper</a>
    private static class DatabaseHelper extends SQLiteOpenHelper {
     
    DatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);//ouverture ou creation de la base si elle n'existe pas
    }
     
    @Override
    // methode qui est appelé quand on ouvre la bas pour la première fois
    public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_RECETTE_TABLE);
    db.execSQL(CREATE_RECETTE_CONTENU);
    db.execSQL(CREATE_RECETTE_CONDIMENT);
    }
     
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//methode permettant une lis aà jour de notre pas de donné
    Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
    + newVersion + ", which will destroy all old data");
    db.execSQL("DROP TABLE IF EXISTS "+INGREDIENT_TABLE);
    db.execSQL("DROP TABLE IF EXISTS "+RECETTE_TABLE);
    db.execSQL("DROP TABLE IF EXISTS "+INGREDIENT_RECETTE_TABLE);
    onCreate(db);
    }
    }

    je vais donc créer pour ma class trois méthodes (pour le moment)

    • open() qui ouvre l’acces a ma base
    • close() qui ferme l’acces a ma base
    • insertRecette() qui enregistre notre recette
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    public void open() throws SQLException
    {
    mDbHelper = new DatabaseHelper(mCtx);
    mDb = mDbHelper.getWritableDatabase();
     
     
    }
     
    public void close()
    {
    mDbHelper.close();
    }
     
    public long insertRecette(String sNomRecette, String sContenuRecette)
    {
    ContentValues initialValues = new ContentValues();
    initialValues.put("nom_larecette", sNomRecette);
    initialValues.put("recette_larecette", sContenuRecette);
    return mDb.insert(RECETTE_TABLE, null, initialValues);
    }

    A suivre comment lier tous ça dans mon application android

    Ne pas oublier d’importer les packages suivant:

    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.database.sqlite.SQLiteQueryBuilder;
    import android.util.Log;

    Il est temps de mettre à profit les tutoriels d’Android France:
    Passez à la vitesse supérieure et investissez quelques dizaines d’euros pour acquérir les connaissances qui vous feront gagner de l’argent avec vos applications, rendez-vous sur notre boutique Android-france pour ces formations en vidéo

    Discutez de ce billet sur le forum

  • 14 Commentaires pour ce billet

    1. Cyril dit:

      test

    2. Alatar dit:

      Quelques corrections apportées, merci.
      Mais la classe BDAccess ne fonctione toujours pas : Eclipse me met une erreur (pas un warning) « the field mCtx may not have been initialized ». L’initialiser à NULL pose t’il problème pour la suite de l’appli?

    3. Alatar dit:

      Autres problèmes : sauter une ligne avant ton « private static final String CREATE_RECETTE_TABLE »

      Autre chose : une initialisation qui traine : dans ta fonction open(), une ligne ne contenant que :
      « mbbuilder = »
      Pas de valeur d’initialisation ni rien, pas de point virgule, le caractère suivant est l’accolade fermante de fin de fonction. En pus, la variable n’a été créée nulle part. Vraie variable utile ou vestige d’une ancienne version?

    4. Guy dit:

      @Alatar : mbbuilder= problème de copier coller, j’ai corrigé mon script merci encore de ta remarque.

    5. coupobol dit:

      @Alatar : Comment as tu fait pour résoudre l’erreur générer à cause de « mCtycx ».

    6. Coupobol dit:

      @Guy : J’ai cette erreur :“the field mCtx may not have been initialized”, lorsque je compile le programme. Peux-tu m’aider à résoudre?

    7. Guy dit:

      @Coupobol : rajoute
      le constructeur
      public BDAcces(Context ctx) {

      this.mCtx = ctx;
      }

    8. Coupobol dit:

      @Guy : Merci Guy

    9. Aberghousse dit:

      Merci pour cet exemple simple et précis.

    10. jagoulard dit:

      je pense qu’il manque les // de commentaire au debut de la ligne 55

    11. Vendetta dit:

      Les explications sont un peu rapide surtout sans le code au complet sous les yeux (on ne sait jamais si on l’a bien inséré le code au bon endroit sauf quand ça marche bien sur …). Y aurait-t-il quelqu’un d’assez sympa pour mettre le code en entier? :-) Pas mal le site sinon!

    12. Guy dit:

      @Vendetta : tu peux télécharger le code entier a l’étape 7 Développez une application pour android etape 7

    13. Vendetta dit:

      Merci je viens de voir ca. Tes explications marchent parfaitement pour l’instant ;) Merci pour ta réponse rapide.

    14. MM dit:

      salut

      le lien pour télécharger le code entier a l’étape 7 Développez une application pour android etape 7 est mort

      merci

  • Laissez un commentaire


  • Wikio - Top des blogs title=


    téléphone portable