I. Introduction▲
Pour notre exemple, nous allons créer une mini base de données pour enregistrer des livres. Durant ce tutoriel, nous utiliserons les classes suivantes :
- SQLiteOpenHelperSQLiteOpenHelper qui est une classe d'assistance pour gérer la création de bases de données et la gestion des versions ;
- ContentValueContentValue, cette classe est utilisée pour stocker un ensemble de valeurs que le ContentResolverContentResolver peut traiter ;
- CursorCursor 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 tutoriel on ne va pas faire d'interface graphique, on va juste afficher les résultats de nos requêtes dans des toasts.
II. 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+
"
\n
ISBN : "
+
isbn+
"
\n
Titre : "
+
titre;
}
}
Maintenant nous allons faire une nouvelle classe que j'ai appelée MaBaseSQLite et qui hérite 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é :
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ée 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 faire 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ée 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ée à 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 simplement préciser quel 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 valeurs 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'à 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ée 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 nouvelles informations du livre pour vérifier 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 essaye 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 tutoriel sur SQLite ! Alors c'est si terrible que ça ? Si vous n'avez pas compris quelque chose, n'hésitez pas à poser vos questions dans un commentaire (enfin regardez bien d'abord si vous avez tout fait ;) ). Pour nous aider et nous remercier, ce serait gentil de partager ce tutoriel sur TwitterTutoMobile et FaceBookFaceBook.
III. Remerciements▲
Je tiens à remercier tout particulièrement MrDuchnokhttp://www.developpez.net/forums/u4372/mrduchnok/ qui a mis ce tutoriel au format Developpez.com.
Merci également à Mahefasoahttp://www.developpez.net/forums/u25336/mahefasoa/ et à ClaudeLELOUP d'avoir pris le temps de le relire et de le corriger.