Académique Documents
Professionnel Documents
Culture Documents
INTRODUCTION
▸ L'enregistrement de données dans une
base de données est idéal pour les
données répétitives ou structurées.
© Hatem Aziza
CHAPITRE 7: SQLite 3
INTRODUCTION
▸ SQLite est un moteur de base de données SQL intégré.
▸ Contrairement à la plupart des autres bases de données SQL, SQLite n'a pas
de processus serveur séparé.
▸ Une base de données SQL complète avec plusieurs tables, index, déclencheurs
et vues est contenue dans un seul fichier disque.
© Hatem Aziza
CHAPITRE 7: SQLite 4
MODE TERMINAL
▸ On peut lancer sqlite à partir du terminal « Bash »:
© Hatem Aziza
CHAPITRE 7: SQLite 5
MODE TERMINAL
▸ Le shell de SQLite3 possède des commandes internes, p. ex. :
.dump table affiche le contenu de la table ou de toute la base si la table est omise
.headers mettre on ou off pour écrire les noms des colonnes en tête de tous les
select
© Hatem Aziza
CHAPITRE 7: SQLite 6
2. Exécution de requêtes :
▸ Obtention d'un Curseur sur le résultat des select Cursor cursor = bdd.rawQuery(requete, ...);
© Hatem Aziza
CHAPITRE 7: SQLite 7
Cursor rawQuery(String sql, ...) pour des SELECT qui retournent des n-uplets.
© Hatem Aziza
CHAPITRE 7: SQLite 8
MÉTHODES SQLiteDatabase.execSQL
Cette méthode exécute une requête SQL qui ne retourne pas d'informations : CREATE,
INSERT, UPDATE, etc.
▸ void execSQL (String sql) : on doit juste fournir la requête sous forme d'une chaîne.
▸ execSQL (String sql, Object[] bindArgs) : c'est pour le même type de requête mais
contenant des paramètres, marqués par des ? et affectés aux objets fournis en paramètre.
bdd.execSQL("DELETE FROM Types WHERE _id BETWEEN ? AND ?", new Object[] { 3, 8 });
© Hatem Aziza
CHAPITRE 7: SQLite 9
MÉTHODES SQLiteDatabase.rawQuery
▸ Cette méthode, rawQuery permet d'exécuter des requêtes de type SELECT.
▸ Elle retourne un objet Java de type Cursor qui permet de parcourir les n-uplets
un à un.
Cursor cursor = bdd.rawQuery ("SELECT * FROM table WHERE..." );
try {
if (cursor.moveToFirst ()) { // obligatoire
while (!cursor.isAfterLast ()) { // test de fin
/** utiliser le curseur... **/
cursor.moveToNext (); // n-uplet suivant
}
}
} finally {
cursor.close ();
}
© Hatem Aziza
CHAPITRE 7: SQLite 10
LA CLASSE Cursor
La classe Cursor propose deux types de méthodes :
▸ celles qui permettent d'obtenir la valeur de la colonne nc
▸ celles qui permettent de parcourir les n-uplets : (0..getColumnCount()-1) du n-uplet courant :
moveToFirst() : met le curseur sur le premier, getInt(nc), getLong(nc), getFloat(nc), getString(nc), etc.:
valeur de la colonne nc.
isAfterLast() : retourne vrai si le parcours est fini,
© Hatem Aziza
CHAPITRE 7: SQLite 11
MÉTHODES SPÉCIALISÉES
▸ Android propose des méthodes spécifiques pour insérer, modifier, supprimer
des n-uplets :
© Hatem Aziza
CHAPITRE 7: SQLite 12
MÉTHODE INSERT
▸ int insert(String table, null, ContentValues valeurs)
▸ null : nullColumnHack
▸ valeurs : c'est une structure du type ContentValues qui associe des noms et des valeurs
quelconques :
ContentValues valeurs = new ContentValues();
valeurs.putNull("_id");
valeurs.put("libelle", "cinéma");
bdd.insert("Types", null, valeurs);
© Hatem Aziza
CHAPITRE 7: SQLite 13
© Hatem Aziza
CHAPITRE 7: SQLite 14
CLASSE DE CONTRAT
▸ Une classe de contrat est un conteneur pour les constantes qui définissent les
noms des URI, des tables et des colonnes. La classe de contrat vous permet
d'utiliser les mêmes constantes dans toutes les autres classes du même
package. Cela vous permet de modifier un nom de colonne en un seul endroit
et de le propager dans tout votre code.
© Hatem Aziza
CHAPITRE 7: SQLite 15
@Override
public String toString() {
return id + " " + libelle;
}
}
© Hatem Aziza
CHAPITRE 7: SQLite 17
SQLiteOpenHelper
▸ La classe SQLiteOpenHelper contient un ensemble d’API utiles pour la gestion
de votre base de données.
▸ Lorsque vous utilisez cette classe pour obtenir des références à votre base de
données, le système effectue les opérations potentiellement longues de
création et de mise à jour de la base de données uniquement lorsque cela est
nécessaire et non au démarrage de l'application. Tout ce que vous devez faire
est d'appeler getWritableDatabase() ou getReadableDatabase().
© Hatem Aziza
CHAPITRE 7: SQLite 18
SQLiteOpenHelper - Exemple
package com.sesame.sqliteexample;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
@Override
public void onCreate(SQLiteDatabase bdd) {
TableTypes.create(bdd);
}
@Override
public void onUpgrade(SQLiteDatabase bdd, int oldVersion, int newVersion) {
TableTypes.drop(bdd);
onCreate(bdd);
}
} © Hatem Aziza
CHAPITRE 7: SQLite 19
SQLiteOpenHelper - Utilisation
▸ Avec un helper :
▸ ou en modification :
▸ A la terminaison de l'application, c'est le helper qu'il faut fermer, et c'est lui qui ferme la base :
helper.close();
© Hatem Aziza
CHAPITRE 7: SQLite 20
SQLiteOpenHelper - Utilisation
public class MainActivity extends AppCompatActivity {
SQLiteDatabase bdd;
MySQLiteHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TableTypes.drop(bdd);
TableTypes.create(bdd);
TableTypes.insertType(bdd, …………);
.......
}
..........
@Override
protected void onDestroy() {
super.onDestroy();
helper.close();
} © Hatem Aziza
}
CHAPITRE 7: SQLite 21
Exercice - ListView
▸ On revient vers l'application qui affiche une liste. Cette fois, la liste doit être le
résultat d'une requête SELECT.
© Hatem Aziza
CHAPITRE 7: SQLite 22
Exercice - ListView
PRINCIPE
Exercice - ListView
ÉTAPES
▸ Dans le méthode onCreate de l'activité qui affiche la liste :
1. Définir un adaptateur de curseur pour la liste
© Hatem Aziza
CHAPITRE 7: SQLite 24
Exercice - ListView
ÉTAPE 1: DÉFINIR UN ADAPTATEUR
public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks <Cursor> {
private MySQLiteHelper helper;
private SQLiteDatabase bdd;
private SimpleCursorAdapter adapter;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate (savedInstanceState);
setContentView (R.layout .main );
adapter = new SimpleCursorAdapter(this,
// layout des éléments de la liste
android.R.layout.simple_list_item_2,
// le curseur sera chargé par le loader
null,
// champs à afficher
new String[]{TableTypes.Id, TableTypes.Libelle},
// identifiants des TextView qui affichent les champs
new int[]{android.R.id.text1, android.R.id.text2},
0); // options, toujours mettre 0
© Hatem Aziza
setListAdapter(adapter);
CHAPITRE 7: SQLite 25
Exercice - ListView
ÉTAPE 2: OUVERTURE DE LA BASE DE DONNÉES
// identifiant du chargeur (utile s'il y en a plusieurs)
private static final int LOADER_ID = 1;
// ouvrir la base de données SQLite
helper = new MySQLiteHelper(this);
bdd = helper.getReadableDatabase();
© Hatem Aziza
CHAPITRE 7: SQLite 26
Exercice - ListView
ÉTAPE 4: DÉFINIR MonCursorLoader
▸ C’est une classe privée déclarer dans l’activité. Son rôle est de lancer la requête
qui retourne le curseur contenant les données à afficher.
static private class MonCursorLoader extends CursorLoader {
private SQLiteDatabase bdd;
public MonCursorLoader (Context context, SQLiteDatabase bdd) {
super (context);
this .bdd = bdd;
}
@Override
protected Cursor onLoadInBackground () {
return TableTypes.getAllTypes (bdd);
}
}
© Hatem Aziza
CHAPITRE 7: SQLite 27
Exercice - ListView
ÉTAPE 5: DÉFINIR onCreateLoader, onLoadFinished et onLoaderReset
@Override
public Loader<Cursor> onCreateLoader (int loaderID, Bundle bundle) {
return new MonCursorLoader (getApplicationContext (), bdd);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
adapter.changeCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
© Hatem Aziza
CHAPITRE 7: SQLite 28
WEBSERVICES
▸ Dans cette partie, on va traiter le cas où une application Android stocke ses
données sur un serveur distant.
Les INSERT, UPDATE, DELETE. . . vont être envoyés par des POST.
PRINCIPE GÉNÉRAL
▸ Soit la requête SELECT * FROM Types WHERE _id=3. On va envoyer l'identifiant 3 sur le réseau et c'est
un script PHP qui va effectuer la requête.
2. Le script PHP exécute la requête puis retourne le résultat encodé en JSON à l'application,
© Hatem Aziza
CHAPITRE 7: SQLite 30
[[1,"Repas"],[2,"Sport"],[4,"Sorties"],[6,"Fringues"],[7,"Transports"]]
▸ En PHP :
// encodage : tableau -> jsondata
$jsondata = json_encode($tableau);
// décodage : jsondata -> tableau
$tableau = json_decode($jsondata);
© Hatem Aziza
CHAPITRE 7: SQLite 31
© Hatem Aziza
CHAPITRE 7: SQLite 32
© Hatem Aziza
CHAPITRE 7: SQLite 33
EN JAVA
▸ En Java, il faut employer une instance de JSONArray. Elle possède des setters
et des getters pour chaque type de données.
// encodage : tableau -> jsondata
int[] tableau = ...;
JSONArray ja = new JSONArray();
for (int v: tableau) ja.put(v);
String jsondata = ja.toString();
// décodage : jsondata -> tableau
JSONArray ja = new JSONArray(jsondata);
final int nb = ja.length();
int[] tableau = new int[nb];
for (int i=0; i<nb; i++) tableau[i] = ja.getInt(i);
© Hatem Aziza
CHAPITRE 7: SQLite 34
© Hatem Aziza