Chapitre 04cds
Chapitre 04cds
Chapitre 04cds
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. dire 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
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;
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.
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.
•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.
• 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.
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
• 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
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";
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);
}
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= (TextView) view.findViewById(R.id.editnom);
TextView edit_prenom= (TextView) view.findViewById(R.id.editprenom);
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
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
CursorAdapter
Exemple:
Coté activité:
public class Liste_Etudiant extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_liste__etudiant);
DBHandler mydb=new DBHandler(this);
30
JSON ( JavaScript Object Notation)
• JSON est un format léger d’échange de données (Plus léger que XML)
•La plate-forme Android inclut les bibliothèques json qui permettent de travailler
facilement avec des fichiers JSON.
31
Les éléments de JSON
32
Exemple de JSON:
[
{ "matricule":"B2014",
"nom":"Tom",
"prenom":"Jerry"
},
{ "matricule":"B2015",
"nom":"Amine",
"prenom":"Omar"
},
{ "matricule":"B2016",
"nom":"Karima",
"prenom":"Imane"
}
]
33
Lire du JSON
• Android fournie différentes classes pour manipuler les données JSON
Exemple: JSONArray, JSONObject,…
• Exemple:
String strJson="[{\"matricule\":\"B2014\",\"nom\":\"Tom\",\"prenom\":\"Jerry\"},
{\"matricule\":\"B2015\",\"nom\":\"Amine\",\"prenom\":\"Omar\"},
{\"matricule\":\"B2016\",\"nom\":\"Karima\",\"prenom\":\"Imane\"}]";
JSONArray arrayJson = new JSONArray(strJson);
for (int i = 0; i < arrayJson.length(); i++) {
JSONObject j=arrayJson.getJSONObject(i);
... ...
}
34
Lire du JSON
• Exemple:
String strJson="[{\"matricule\":\"B2014\",\"nom\":\"Tom\",\"prenom\":\"Jerry\"}...]";
JSONArray arrayJson = new JSONArray(strJson);
JSONObject j=arrayJson.getJSONObject(0);
String str_mat=j.getString("matricule"); // str_mat=B2041
String str_nom=j.getString("nom"); // str_nom=Tom
String str_prenom=j.getString("prenom"); // str_prenom=Jerry
35
Lire du JSON
37
Connexion à un serveur de base de données
I. Coté serveur
1. Base de données:
Un SGBD (ex: mysql, … ) et une base de
données (ex: base de donnée dbtest contient
une table etudiant(matricule, nom, prenom) ).
2. Fichier PHP:
Un scripte PHP consiste à envoyer des requêtes SQL à la base de
données dbtest qui contient la table etudiant. Il récupère le résultat des
requêtes, ensuite l'encode en JSON grâce a la fonction json_encode().
38
Connexion à un serveur de base de données
• Exemple de scripte PHP
<?php
try {
// connexion à la base de données.
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=dbtest', 'root', '', $pdo_options);
// Executer une requête SQL.
$sql = 'SELECT * FROM etudiant;';
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
// encoder le résultat en JSON.
echo(json_encode($output));
?> 39
Connexion à un serveur de base de données
II. Coté Client Android
Au niveau du Client Android, il s'agit de:
Demander au serveur de renvoyer les données grâce aux commandes HttpURLConnection,
en indiquant le chemin du fichier PHP à interroger
• Remarque: l'adresse locale pour l'emulateur Android est 10.0.2.2.
(ex: String url = "http://10.0.2.2/testandroid/data.php";).
Récupération (décodage) des données (car elles sont renvoyées sous forme JSON).
Remarque:
• Il faut que l’application soit autorisée à accéder à internet. Ajouter la permission
<uses-permission android:name="android.permission.INTERNET"/> 40
Connexion à un serveur de base de données
II. Coté Client Android
Pour décoder les données JSON, nous utilisons les classes (JSONArray,
JSONObject, … ) vue précédemment.
42
Connexion à un serveur de base de données
• Problème:
Une activité Android est exécuté par un seul processus léger, un thread appelé «Main
thread».
Ce thread ne doit jamais travailler plus de quelques fractions de secondes sinon l’interface
paraît bloquée et Android peut décider que l’application est morte.
• Solution:
La solution passe par une séparation des threads, par exemple à l’aide d’une tâche
asynchrone AsyncTask.
C’est un autre thread, indépendant de l’interface utilisateur
L’interface utilisateur peut être mise à jour de temps en temps par le thread AsyncTask.
Il est également possible de récupérer des résultats à la fin de l’exécution de thread
AsyncTask.
43
Connexion à un serveur de base de données
44
Structure d’un thread AsyncTask
45
Paramètres d’une AsyncTask
46
Connexion à un serveur de base de données
......
48
Écrire du JSON
Exemple:
JSONObject object = new JSONObject();
try {
object.put("matricule", "B2017");
object.put("nom", "Karim");
object.put("prenom", "Karim");
} catch (JSONException e) { e.printStackTrace(); }
49
50