Skip to content

19 octobre 2010 | Rédigé par Axon

85

Comment utiliser SQLite sous Android [Tutoriel Android n°19]

Après une grosse période de coupure, me revoilà avec de nouveaux tutos. Celui d’aujourd’hui concerne SQLite sous Android. C’est toujours utile de pouvoir stocker quelques données dans une application. Les tables que l’on créé avec SQLite doivent bien entendu être simple tout comme les requêtes que vous ferez dessus. Rappelez-vous que l’on n’est pas sur des méga serveurs ultra puissants, mais simplement sur un mobile ! ;)

Pour notre exemple, nous allons créer une mini base de données pour enregistrer des livres. Durant ce tuto, nous utiliserons les classes suivantes :

  • SQLiteOpenHelper qui est une classe d’assistance pour gérer la création de bases de données et la gestion des versions.
  • ContentValue, cette classe est utilisée pour stocker un ensemble de valeurs que le ContentResolver peut traiter.
  • Cursor est une interface qui donne accès en lecture-écriture à l’ensemble des résultats retournés par une requête de base de données.

On va donc commencer doucement avec la création de la classe Livre (très simple pour notre exemple). D’ailleurs, dernière petite précision, dans ce tuto on ne va pas faire d’interface graphique, on va juste afficher les résultats de nos requêtes dans des Toast.

Code Java

Après avoir créé un nouveau projet (perso moi je suis toujours avec Android 1.6), on va tout de suite concevoir une nouvelle classe que l’on va appeler Livre. Cette classe est très simple puisque dans notre cas, un livre est défini par un ID, un numéro ISBN et un titre. On crée le constructeur ainsi que les getter et les setter et le tour est joué. Voici le code :

package com.tutomobile.android.sqlite;
 
/**
 * Création d'un livre tout simple pour un exemple d'utilisation de SQLite sous Android
 * @author Axon
 * http://www.tutomobile.fr
 */
public class Livre {
 
	private int id;
	private String isbn;
	private String titre;
 
	public Livre(){}
 
	public Livre(String isbn, String titre){
		this.isbn = isbn;
		this.titre = titre;
	}
 
	public int getId() {
		return id;
	}
 
	public void setId(int id) {
		this.id = id;
	}
 
	public String getIsbn() {
		return isbn;
	}
 
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
 
	public String getTitre() {
		return titre;
	}
 
	public void setTitre(String titre) {
		this.titre = titre;
	}
 
	public String toString(){
		return "ID : "+id+"\nISBN : "+isbn+"\nTitre : "+titre;
	}
}

Maintenant nous allons faire une nouvelle classe que j’ai appelée MaBaseSQLite et qui « extends » de SQLiteOpenHelper. Cette classe va nous permettre de définir la table qui sera produite lors de l’instanciation de celle-ci. Le code est très simple vous allez voir, et je l’ai commentée :

package com.tutomobile.android.sqlite;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
 
public class MaBaseSQLite extends SQLiteOpenHelper {
 
	private static final String TABLE_LIVRES = "table_livres";
	private static final String COL_ID = "ID";
	private static final String COL_ISBN = "ISBN";
	private static final String COL_TITRE = "Titre";
 
	private static final String CREATE_BDD = "CREATE TABLE " + TABLE_LIVRES + " ("
	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_ISBN + " TEXT NOT NULL, "
	+ COL_TITRE + " TEXT NOT NULL);";
 
	public MaBaseSQLite(Context context, String name, CursorFactory factory, int version) {
		super(context, name, factory, version);
	}
 
	@Override
	public void onCreate(SQLiteDatabase db) {
		//on créé la table à partir de la requête écrite dans la variable CREATE_BDD
		db.execSQL(CREATE_BDD);
	}
 
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		//On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
		//comme ça lorsque je change la version les id repartent de 0
		db.execSQL("DROP TABLE " + TABLE_LIVRES + ";");
		onCreate(db);
	}
 
}

Ensuite nous allons créer une nouvelle classe (rassurez-vous, c’est la dernière) que j’ai appelée LivresBDD. Elle va nous permettre de gérer l’insertion, la suppression, la modification de livres dans la BDD (Base De Données) ainsi que de faire des requêtes pour récupérer un livre contenu dans la base de données. Comme d’habitude je vous donne le code commenté, j’espère que cela suffira pour comprendre :

package com.tutomobile.android.sqlite;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
 
public class LivresBDD {
 
	private static final int VERSION_BDD = 1;
	private static final String NOM_BDD = "eleves.db";
 
	private static final String TABLE_LIVRES = "table_livres";
	private static final String COL_ID = "ID";
	private static final int NUM_COL_ID = 0;
	private static final String COL_ISBN = "ISBN";
	private static final int NUM_COL_ISBN = 1;
	private static final String COL_TITRE = "Titre";
	private static final int NUM_COL_TITRE = 2;
 
	private SQLiteDatabase bdd;
 
	private MaBaseSQLite maBaseSQLite;
 
	public LivresBDD(Context context){
		//On créer la BDD et sa table
		maBaseSQLite = new MaBaseSQLite(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 insertLivre(Livre livre){
		//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_ISBN, livre.getIsbn());
		values.put(COL_TITRE, livre.getTitre());
		//on insère l'objet dans la BDD via le ContentValues
		return bdd.insert(TABLE_LIVRES, null, values);
	}
 
	public int updateLivre(int id, Livre livre){
		//La mise à jour d'un livre dans la BDD fonctionne plus ou moins comme une insertion
		//il faut simple préciser quelle livre on doit mettre à jour grâce à l'ID
		ContentValues values = new ContentValues();
		values.put(COL_ISBN, livre.getIsbn());
		values.put(COL_TITRE, livre.getTitre());
		return bdd.update(TABLE_LIVRES, values, COL_ID + " = " +id, null);
	}
 
	public int removeLivreWithID(int id){
		//Suppression d'un livre de la BDD grâce à l'ID
		return bdd.delete(TABLE_LIVRES, COL_ID + " = " +id, null);
	}
 
	public Livre getLivreWithTitre(String titre){
		//Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
		Cursor c = bdd.query(TABLE_LIVRES, new String[] {COL_ID, COL_ISBN, COL_TITRE}, COL_TITRE + " LIKE \"" + titre +"\"", null, null, null, null);
		return cursorToLivre(c);
	}
 
	//Cette méthode permet de convertir un cursor en un livre
	private Livre cursorToLivre(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
		Livre livre = new Livre();
		//on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
		livre.setId(c.getInt(NUM_COL_ID));
		livre.setIsbn(c.getString(NUM_COL_ISBN));
		livre.setTitre(c.getString(NUM_COL_TITRE));
		//On ferme le cursor
		c.close();
 
		//On retourne le livre
		return livre;
	}
}

Bon allez encore un petit d’effort, on tient le bon bout, il ne reste plus qu’a faire le petit bout de code de test. Je ne suis même pas obligé de vous le donner, car si vous avez bien compris ce qu’on a fait avant vous pourrez le faire les doigts dans le nez. Mais bon si vous n’avez pas compris ce qu’on a fait avant, c’est peut être que j’ai mal expliqué donc je vais vous donner le code pour tester notre programme. Celui-ci est à mettre dans l’Activity qui se créer par défaut lorsque vous faites votre nouveau projet Android :

package com.tutomobile.android.sqlite;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
 
public class Tutorial16_Android extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //Création d'une instance de ma classe LivresBDD
        LivresBDD livreBdd = new LivresBDD(this);
 
        //Création d'un livre
        Livre livre = new Livre("123456789", "Programmez pour Android");
 
        //On ouvre la base de données pour écrire dedans
        livreBdd.open();
        //On insère le livre que l'on vient de créer
        livreBdd.insertLivre(livre);
 
        //Pour vérifier que l'on a bien créé notre livre dans la BDD
        //on extrait le livre de la BDD grâce au titre du livre que l'on a créé précédemment
        Livre livreFromBdd = livreBdd.getLivreWithTitre(livre.getTitre());
        //Si un livre est retourné (donc si le livre à bien été ajouté à la BDD)
        if(livreFromBdd != null){
        	//On affiche les infos du livre dans un Toast
        	Toast.makeText(this, livreFromBdd.toString(), Toast.LENGTH_LONG).show();
        	//On modifie le titre du livre
        	livreFromBdd.setTitre("J'ai modifié le titre du livre");
        	//Puis on met à jour la BDD
            livreBdd.updateLivre(livreFromBdd.getId(), livreFromBdd);
        }
 
        //On extrait le livre de la BDD grâce au nouveau titre
        livreFromBdd = livreBdd.getLivreWithTitre("J'ai modifié le titre du livre");
        //S'il existe un livre possédant ce titre dans la BDD
        if(livreFromBdd != null){
	        //On affiche les nouvelle info du livre pour vérifié que le titre du livre a bien été mis à jour
	        Toast.makeText(this, livreFromBdd.toString(), Toast.LENGTH_LONG).show();
	        //on supprime le livre de la BDD grâce à son ID
	    	livreBdd.removeLivreWithID(livreFromBdd.getId());
        }
 
        //On essait d'extraire de nouveau le livre de la BDD toujours grâce à son nouveau titre
        livreFromBdd = livreBdd.getLivreWithTitre("J'ai modifié le titre du livre");
        //Si aucun livre n'est retourné
        if(livreFromBdd == null){
        	//On affiche un message indiquant que le livre n'existe pas dans la BDD
        	Toast.makeText(this, "Ce livre n'existe pas dans la BDD", Toast.LENGTH_LONG).show();
        }
        //Si le livre existe (mais normalement il ne devrait pas)
        else{
        	//on affiche un message indiquant que le livre existe dans la BDD
        	Toast.makeText(this, "Ce livre existe dans la BDD", Toast.LENGTH_LONG).show();
        }
 
        livreBdd.close();
    }
}

Si vous lancez votre application, vous devriez voir apparaître successivement les écrans suivants :

Voilà ! On en a enfin fini avec ce tuto sur SQLite ! Alors c’est si terrible que ça? Si vous n’avez pas compris quelques choses, n’hésitez pas à poser vos questions dans un commentaire (enfin regardez bien d’abord si vous avez tout fait ;) ). En tout cas si cela vous a aidé n’hésitez pas à voter pour lui grâce au petit « + » tout en haut à droite du tuto (à côté du petit coeur) et pour nous aider et nous remercier, se serait gentil de partager ce tuto sur Twitter et FaceBook grâce aux boutons ci-dessous.

Découvrez d'autre articles de la catégorie Tutoriels Android

Encore un peu de lecture :

85 Commentaires Poster un commentaire
  1. mokhtar
    13 fév 2012

    merci pour ce bon tuto mais j’ai voulu extraire des donnes a partir de la base de donnes et le mettre dans une liste view mais j’ai trouve beaucoup de problèmes !! merci esque qul q’un peu me donner un cou de main..
    @Javatar esque vous pouver m’aide car mon application semble a la vote une liste de ville existante et je veu les extraire ver mon application merci d’avance

  2. abid rafik
    24 fév 2012

    salut merci bien pour le code mais svp j’ai une petite probleme l »emulateur lorsque se lance il m’affiche force close et encore il n’affiche pas aucune information a partir de la base est ce qu’il ya des configurations pour eclipse , svp je besoin d’aide :)

  3. abid rafik
    24 fév 2012

    salut pour tout le monde merci pour le tuto
    j’ai un petite probleme lorsque je lance l’ emulateur il m’ affiche et j’ouvre l’application il m’affiche « Force close » erreure malgré le code ne contient aucune erreur et enfin aucune information de la base est affichée svp comment faire afficher le continu de la base y – t il une configuration sur eclipse svp je besoin d’aide trés urgent :)

  4. asma
    24 fév 2012

    salut à tout le monde s’il vous plais je vous savoir si je peux utiliser une base de données vaste localement dans mon projet android?? ou il faut qu’elle doit être distant on m’expliquant comment je peux manipuler une base de données distante sous android sachant que j’utilise oracle 11g
    cordialement asma

  5. wael
    25 fév 2012

    comment affciher les noms des contact ainsi que leur numeros du telephone dans des checkBox dans une ListView???

  6. 26 fév 2012

    Bonjour j’écris ce code source mais il n’affiche rien c quoi le probléme??? :(
    merci

  7. rezgui
    17 mar 2012

    merci pour ce tuto mais
    ce code ne marche pas ??? svp donne moi une solution

  8. jcy
    29 mar 2012

    Bonjour, j’avais une question, la base est crée à chaque lancement de l’application?

  9. 5 avr 2012

    Bonjour et merci pour ce tuto!

    Une petite question, SQLite est-il le moyen le plus efficace pour stocker des données?

    Merci

  10. 6 avr 2012

    Cela dépend des données mais en principe oui

  11. Kowo
    7 avr 2012

    Merci beaucoup pour ce tutoriel, cependant lorsque je souhaite faire une deuxième table de la même en respectant bien le code j’ai une erreur :
    no such table ***** : while compiling SELECT * FROM *****
    J’ai essayé de trouver l’erreur mais impossible

  12. maryeml
    12 avr 2012

    mercii

  13. maryem
    12 avr 2012

    salut tout le monde, moi je vous stocké dans ma base de donnée des mots en francais et leurs traductions en arabes. s’il vous plaît comment faire dans la base? et merci d’avance

  14. khaoula
    29 avr 2012

    Merci infiniment:)

  15. manel
    6 mai 2012

    salut comment afficher les information de la base de donne dans un tableau

  16. clege
    14 mai 2012

    merci pour ce tuto très clair et bien utile.
    aucun soucis pour le refaire et le suivre.
    j’en ai profité pour créer une listview de x livres, j’arrive à afficher un Toast lors d’un clic sur un item, par contre j’aimerais réaliser une seconde activité avec le titre, isbn du livre mais je ne vois pas comment faire.
    Avez-vous une idée ?
    Merci

  17. Oscar Gros Cafard
    18 mai 2012

    Bonjour, tout d’abord, merci pour ces tutos, ils me sont d’une grande aide pour apprendre à programmer sous android.

    J’aurais une question bête je pense mais bon, je me lance.

    Elle se trouve ou la base de données crée ???

    Merci d’avance et bonne journée a tous.

  18. arthur
    20 mai 2012

    Tuto très clair, en revanche ici se crée une bdd à chaque fois que l’activité se crée non ? Comment faire pour ne créer qu’une seule fois la bdd et ensuite la charger lors d’utilisations futures (je suis en train d’essayer de créer des playlists mp3 …) ?

  19. pierre
    23 mai 2012

    Bonjour,

    Comme Jcy l’a posé précédemment, j’aimerais savoir si à chaque lancement de l’application la base de donnée est créée et si à chaque lancement les ajouts que l’on fait se multiplient.

    Apparemment oui car lorsque je veux extraire des données, mon cursor compte 1 puis 2 puis 3 puis 4 puis 5… données après chaque lancement.

    Comment pourrais-je éviter ça ?

    Comment puis-je tester si ma base existe afin de ne pas ré-insérer des données déjà existantes ?

    Merci d’avance pour votre réponse et merci pour ce tutoriel.

  20. Nox
    11 juin 2012

    Pour te répondre Pierre, tu peux par exemple, dans le fichier MaBaseSQLLite, remplacer le début de la commande sql « CREATE_BDD » en changeant le CREATE TABLE en UPDATE TABLE.
    Ainsi, tu pourras voir tes id continuer de s’incrémenter même si tu relance ton app!

  21. 18 juin 2012

    Bonjour,
    Super tuto merci !
    J’avais une question pour l’utilisateur final en fait (un peu comme oscar)
    Quand on desinstalle l’appli, la BDD se desinstalle toute seule ou bien …? (et sinon elles sont stockées ou?)

    Si on regarde le commentaire d’arthur, puis celui de pierre, on ne sait pas si la BDD est persistante entre 2 ouvertures ou pas (et je n’ai pas d’android sous la main pour tester) Donc si un admin passe par là et peut repondre (sinon je tenterai une reponse ce soir)

  22. chadli
    19 juin 2012

    merci bcp pour ce tuto mais comment afficher les donnee dons une listView ?
    merci d’avant pour l’aide.

  23. 21 juin 2012

    @Ronanry : entre deux ouvertures de l’appli oui la BDD est persistante, sinon aucun intérêt. Elle est supprimée uniquement lorsque l’utilisateur désinstalle l’appli.

  24. Matthias
    11 nov 2012

    Bonsoir Axon,

    Je ne sais pas si tu réponderas toujours aux questions relatives à ce sujet. Voilà mon problème,
    J’ai plusieurs activity dans mon projet et j’aimerais pouvoir utiliser les données enregistrés dans la base dans plusieurs de ces activités, je me demandais donc comment procéder.
    J’ai essayé d’instancier ScoreBDD (qui correspond à livreBDD ici), de manière static dans ma MainActivity, mais j’ai un nullPointerException lorsque j’essaie d’y accéder à partir d’une autre activity.

    Merci,

    Cordialement

    Mat

  25. HulDaav
    27 déc 2012

    Un tres bon article, merci pour l’effort.

  26. Pierre
    24 jan 2013

    Bonjour,

    merci pour ce tuto très clair.

    J’ai essayé de le reprendre pour l’adapter à mes besoins de BD, et ai donc créé une table Noeuds avec différentes colonnes.

    Lors de l’insertion de values dans celle-ci, j’ai d’abord reçu un code d’erreur (return -1, comme précisé dans la doc de SQLiteDatabase).

    En passant à la méthode insertWithOnConflict, je reçois une exception m’indiquant que je ne parviens pas à accéder à une de mes colonnes, dont le nom est stocké dans un fichier de variables à part, et rappelé de la meme façon que ce soit à la création de la base, ou à l’insertion => Normalement le nom de colonne et le nom présent dans la base sont les mêmes.

    Le message d’erreur complet est :

    table table_noeuds has no column named META :, while compiling : INSERT OR REPLACE INTO table_noeuds(QRCODE, NOM, PERE, META) VALUES (?,?,?,?)

    Je ne m’explique pas la présence du :, après META, et j’ai vérifié les strings stockées et appelées.

    Une idée de la provenance de l’erreur ?

  27. Flo
    7 fév 2013

    Salut, du d’abord merci pour ce tuto !!

    Ensuite j’avais un petite question pour les IDs !
    Là, si je ne me trompe pas, quand on crée un livre il n’a pas d’ID. Un l’ajoute dans la BD (qui lui en donne un) mais l’objet livre n’a toujours pas d’ID. Pour connaître l’ID, il faut récupérer le livre dans la BD grace à son titre (qui n’est pas forcément clès primaire).

    C’est pas … très joli tout ca ???? Y’a pas un moyen plus « sexy » ?
    Par exemple : quand j’ajoute le livre je récupére le long de la ligne correspondante pour pouvoir le récupérer et mettre a jour la livre (je sais ca fait un peu lourd !)

    Merci de la future réponse !

  28. salwa
    7 fév 2013

    quel est la version de sqllite utulisee ???????????

  29. modjo
    7 mar 2013

    comment on fait pour récupérer le contenus d’un edittext dans une base données sqlite saisi par l’utilisateur et si elle n’existe pas lui affichez que le text demandé ne se trouve pas dans la base de données

  30. moijdik
    17 mar 2013

    moi jaimerais bien avoir acces aux BD depuis internet, un autre mobile ou pc faisant tourner java…

  31. Pedrolito
    27 mar 2013

    @Axon : je ne comprends pas comment la BDD peut etre persistante, celle-ci étant créée à chaque lancement de l’application ?

  32. zied
    16 avr 2013

    Bonjour,
    Super tuto merci !
    je suis entrain de développer une application m-ticket cinéma en android et j’ai un problème dans la connexion a la base de donnée avec SQLite sous Android !!!

    SVP aider moi pour insérer ces éléments (nom,prénom,Cin, carte_bancaire) dans la base de donnée et l’afficher en liste View !?

    merci d’avant pour Votre aide .

  33. omar
    26 avr 2013

    slt :)
    cvp comment faire une misajour automatique de ma base sqlite par un service web

Trackbacks & Pingbacks

  1. Les tweets qui mentionnent Comment utiliser SQLite sous Android [Tutoriel Android n°19] | Tuto Mobile -- Topsy.com

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires