Vous êtes sur la page 1sur 28

Les bases de données

avec SQLite

1
Introduction
• Est un SGBD relationnel, léger, gratuit et Open Source
• Très utilisé dans le domaine des appareils mobiles
• Il fournit un support de bases de données relationnelles simplifiée
pour tenir sur une tablette.
• Ce qui lui manque :
• Pas de gestion des utilisateurs (pas de sécurité).
• Pas de réglages pour améliorer les performances
• Peu de types de données
• Fonctionne sans serveur, il stocke les données dans un fichier
portable (i.e. copiable sur n’importe quelle autre machine).
2
Introduction

 Une application peut stocker des données dans une ou plusieurs bases
de données SQLite
 Les bases de données sont privées à l'application qui les a créées
– Pour les partagées (les rendre publiques), on doit passer par un
fournisseur de contenu (ContentProvider)

3
Syntaxe SQLite
 Type de données:
• INTEGER : nombres entiers, signés ou non
• REAL : nombres réels
• TEXT : données textuelles
• BLOB : stockage de données sous forme binaire
• NULL : si la donnée est nulle

Syntaxe SQLite:
• Toutes les requêtes SQL que vous connaissez fonctionnent.
• Exemples SQL:
• SELECT COUNT(*) FROM Person WHERE nom LIKE ‘M%';
• SELECT * FROM Person WHERE age> 20 ORDER BY age;
• SELECT AVG(age) AS moyenne FROM Person GROUP BY ……….;
• DELETE FROM Person WHERE nom=“Mohamed”;
4
Syntaxe SQLite

 Création d’une table:


CREATE TABLE table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype);

 Suppression d’une table:


DROP TABLE table_name;

5
Syntaxe SQLite
 La requête INSERT INTO
1. On spécifier les noms des colonnes et les valeurs à insérer:
INSERT INTO TABLE_NAME [(column1, column2,...columnN)] VALUES
(value1, value2,...valueN);

2. Si on ajoute des valeurs pour toutes les colonnes de la table, on peut ne pas spécifier les
noms des colonnes.
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

6
Syntaxe SQLite
 La requête SELECT
• Requête simple:
SELECT column1, column2,..., columnN FROM table_name;

• Requête SELECT avec condition:


SELECT column1, column2, columnN
FROM table_name
WHERE [CONDITION];

• Requête SELECT avec plusieurs conditions:


SELECT column1, column2, columnN
FROM table_name
WHERE [condition1] AND [condition2]... OR [conditionN];
7
Syntaxe SQLite
 La requête UPDATE
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

 La requête DELETE
DELETE FROM table_name
WHERE [condition];

8
SQLite dans une application Android

 Recommandations
• Il est recommandé de définir une classe associée à chaque table(Ça permet de faire
évoluer le logiciel assez facilement).
• Les instances de la classe sont les n-uplets de la table.
• Définir une classe qui regroupe toutes les requêtes SQL la concernant : création,
suppression, mise à jour, parcours, insertions. . . sous forme de méthodes de classe.

• Une BDD SQLite est un fichier *.db placé dans le dossier


/data/data/PAQUETAGE/databases/NOM_BDD

9
Classes pour travailler avec SQLite

 La classe SQLiteDatabase
• Représente une BDD.
• Ses méthodes permettent d’exécuter une requête, par exemple :
void execSQL(String sql) pour CREATE, ALTER, DROP. . . qui ne retournent pas de données.
Cursor rawQuery(String sql, ...) pour des SELECT qui retournent des n-uplets.

 Les méthodes de la classe SQLiteDatabase:


La méthode rawQuery:
• Cette méthode permet d’exécuter des requêtes de type SELECT.
• Elle retourne un objet de type Cursor qui permet de parcourir les n-uplets un à un :
• Exemple: (soit bdd un objet de type SQLiteDatabase)
• Cursor cursor = bdd.rawQuery("SELECT * FROM Etudiant WHERE...");
10
Classes pour travailler avec SQLite

 Les méthodes de la classe SQLiteDatabase: (suite)


La méthode execSQL : Cette méthode exécute une requête SQL qui ne retourne pas
d’informations : CREATE, INSERT. . .
•void execSQL(String sql) : on doit fournir la requête sous forme d’une chaîne.
• Exemple :
bdd.execSQL("DROP TABLE Etudiant");

•void execSQL(String sql, String[] Args) : c’est pour le même type de requête
mais contenant des jokers ? à affecter avec les chaînes fournis en paramètre.
• Exemple :
bdd.execSQL("DELETE FROM Etudiant WHERE nom=?
AND prenom=?", new String[] {"Amine", "Mohamed"});
11
Classes pour travailler avec SQLite
 Les méthodes de la classe SQLiteDatabase: (suite)
Méthodes spécialisées
•int insert(String table, null, ContentValues val)
•retourne l’identifiant du nouveau n-uplet
• int update(String table, ContentValues val,
String whereClause, String[] Args)
• int delete(String table, String whereClause, String[] Args)
• update et delete retournent le nombre de n-uplets modifiées.

•Les paramètres sont :


• table : le nom de la table
• val : une structure du type ContentValues qui associe des noms et des valeurs :
• whereClause : une condition contenant des jokers ?
• whereArgs : chaînes à mettre à la place des ?
12
Classes pour travailler avec SQLite
 Les méthodes de la classe SQLiteDatabase: (suite)

Méthodes spécialisées (suite)

• Exemples:
ContentValues valeurs = new ContentValues();
valeurs.put("nom", "Amine");
valeurs.put("prenom", "Mohamed");
bdd.update("Etudiant", valeurs, "matricule=?",
new String[] { "D0014" });
bdd.delete("Etudiant", "age BETWEEN ? AND ?",
new String[]{"20","22"});

13
Classes pour travailler avec SQLite

 La classe Cursor
• Permet de parcourir le résultat d’une requête SELECT.

• Méthodes de la classe Cursor


• getCount() : retourne le nombre de ligne (le nombre d’enregistrement),
• getColumnCount() : retourne le nombre de colonnes
• moveToFirst() : positionner le curseur sur le premier
• isAfterLast() : retourne vrai si le parcours est fini
• moveToNext() : passe à la ligne suivante.
• getInt(i), getLong(i), getString(i), ... : récupérer la valeur de la colonne i.

14
 La classe SQLiteOpenHelper

• Android fournit la classe SQLiteOpenHelper qui permet de faciliter la gestion d’une base
de données.
• Le développeur doit créer une classe qui la spécialise, il faut redéfinir deux méthodes :
• une méthode de création
public void onCreate(SQLiteDatabase db)
• une méthode de mise à jour
public void onUpgrade(SQLiteDatabase db, int odlVersion, int newVersion)
où ● db est la base de données manipulée
● oldVersion est la version précédente de la base de données
● newVersion la nouvelle version de la base de données

15
 La classe SQLiteOpenHelper

• Une sorte d’écouteur avec deux méthodes à surcharger :


• onCreate() : cette méthode est appelée quand la base de données n’existe pas
encore. Son rôle est de créer les tables.

• onUpgrade() : cette méthode est appelée quand la nouvelle version de la base


de données est supérieure à la version précédente (newVersion > oldVersion) .
Son rôle est de mettre à jour les tables de la base de données.

• Autres méthodes:
• getReadableDatabase pour ouvrir la base de données en mode lecture.
• getWritableDatabase pour ouvrir la base de données en mode ecriture.

16
Exemple:
 Ecrire un programme Android qui permet de stocker une liste d’étudiants dans
une base de données SQLite

1. La classe Etudiant

public class Etudiant {


public String matricule, nom, prenom;
public Etudiant(String matricule, String nom, String prenom){
this.matricule=matricule; this.nom=nom; this.prenom=prenom;
}
}

17
Exemple: (suite)
2. Une classe pour gérer la BDD
public class DBExemple extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "dbcours";

public DBExemple(Context context) { super(context, DB_NAME, null, DB_VERSION); }


@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE etudiant(matricule TEXT PRIMARY KEY, nom TEXT, prenom TEXT)";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS etudiant");
onCreate(db);
}
public Etudiant getEtudiant(String matricule) { … }
public void addEtudiant(Etudiant e) { …. }
18
}
Exemple: (suite)
2. Une classe pour gérer la BDD (suite)
public class DBExemple extends SQLiteOpenHelper {
…..
public Etudiant getEtudiant(String matricule) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor= db.rawQuery("Select * from etudiant where matricule=?",new String[]{matricule});
if (cursor.getCount()==0) return null;
cursor.moveToFirst();
Etudiant e = new Etudiant(cursor.getString(0), cursor.getString(1), cursor.getString(2));
return e;
}
public void addEtudiant(Etudiant e) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues val = new ContentValues();
val.put("matricule", e.matricule); val.put("nom", e.nom); val.put("nom", e.prenom);
db.insert("etudiant",null,val);
db.close();
}
} 19
Exemple: (suite)
3. L’activité Android:
public class MainActivity extends AppCompatActivity {
EditText editmat, editnom, editprenom;
DBExemple mydb;
@Override
protected void onCreate(Bundle savedInstanceState) {
……
editmat=this.findViewById(R.id. editmat);
……
mydb=new DBExemple(this);
}
public void ajouter(View v){
….
Etudiant e=new Etudiant(editmat.getText(). toString(), editnom.getText(). toString(),
editprenom.getText(). toString());
mydb.addEtudiant(e);
}
} 20
CursorAdapter
• Est un Adaptateur qui expose les données d'un Cursor à un ListView.
• Cursor est une classe qui permet de parcourir le résultat d’une requête SELECT.
• Il suffit d’étendre la classe CursorAdapter et redéfinir les méthodes newView() et
bindView()
• Le constructeur de la classe héritant de la classe CursorAdapter possède deux
paramètres:
• context: le contexte de l’application.
• cursor: résultat d’une requête SELECT.

public MyCursorAdapter(Context context, Cursor cursor) {


super(context, cursor, 0);
}

21
CursorAdapter

• La méthode newView():
• est utilisée pour instancier une nouvelle vue et la renvoyer.

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_layout, parent,
false);
}

Avec: item_layout est le fichier décrivant les items de ListView (res/layout/item_layout.xml)

22
CursorAdapter
• La méthode bindView():
• Est utilisée pour lier les données à une vue donnée.
• Exemple
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Les champs à remplir dans la vue de l’item
TextView edit_nom = view.findViewById(R.id.editnom);
TextView edit_prenom = view.findViewById(R.id.editprenom);

// Extraction des données du curseur


String str_nom = cursor.getString(0);
// 0 est la position de colonne nom
String str_prenom = cursor.getString(1);
// 1 est la position de colonne prenom

// Remplir les champs par les données extraites


edit_nom.setText(str_nom);
edit_prenom.setText(str_prenom); 23
}
CursorAdapter

 Récupération du curseur:
• Pour utiliser un CursorAdapter, nous devons interroger une base de données SQLite et
récupérer un Cursor représentant le résultat.
• Nous pouvons utiliser SQLiteOpenHelper qui donne accès à la base de données sous-jacente.
• Nous utilisons la méthode rawQuery qui renvoie un Cursor.

Exemple:
// DBExemple est une sous classe de la classe SQLiteOpenHelper
DBExemple mydbh= new DBExemple(this);
SQLiteDatabase db = mydbh.getReadableDatabase();
Cursor cursor= db.rawQuery("SELECT * FROM etudiant", null);

24
CursorAdapter

 Attacher l'adaptateur à un ListView:


• L'adaptateur est utilisé dans l'activité pour afficher un ensemble d'éléments dans un
ListView

Exemple:
// Trouver ListView à remplir (lv est l’identifiant de ListView)
ListView lv= this.findViewById(R.id.lv);
// Création de l’adaptateur
MyCursorAdapter adapter= new MyCursorAdapter(this, cursor);
// Attacher l’adaptateur au ListView
lv.setAdapter(adapter);

25
CursorAdapter liste_etudiant.xml
<RelativeLayout ......>
<ListView
Exemple: android:layout_width="....."
android:layout_height="...."
android:id="@+id/lv"></ListView>
</RelativeLayout>
Item_layout.xml

26
CursorAdapter
Exemple:

Coté adaptateur:
public class MyCursorAdapter extends CursorAdapter {
public MyCursorAdapter(Context context, Cursor cursor) {
super(context, cursor, 0);
}
// The newView method is used to inflate a new view and return it
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_layout, parent,
false);
}

27
CursorAdapter
Exemple: Coté adaptateur (suite)
// The bindView method is used to bind all data to a given view
@Override
public void bindView(View view, Context context, Cursor cursor) {
// Find fields to populate in inflated template
TextView txtmat = (TextView) view.findViewById(R.id.txtmat);
TextView txtnom = (TextView) view.findViewById(R.id.txtnom);
TextView txtprenom = (TextView) view.findViewById(R.id.txtprenom);
// Extract properties from cursor
String mat = cursor.getString(1);
String nom = cursor.getString(2);
String prenom = cursor.getString(3);
// Populate fields with extracted properties
txtmat.setText(mat);
txtnom.setText(nom);
txtprenom.setText(prenom);
}
} 28

Vous aimerez peut-être aussi