UF3: APPLICATIONS MOBILES (APM)
5ième Cours: Base de Données Mobile
Dr. MECHTA Djamila
La plupart des applications mobiles nécessitent que les données
soient stockées, organisées et visualisées.
Les applications plus complexes peuvent bénéficier d’une base de
données supportant:
Organiser les données dans divers tables
Fournir une recherche rapide en utilisant des index
Représenter les relations entre les données de différentes tables via
des clés étrangères
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Le magasin des (Repository) données local stockées dans la
mémoire de l’appareil mobile, qui devrait de préférence:
Télécharger et stocker des informations à partir du serveur
central/master (réplication)
Propager les modifications (effectuées pendant la phase
déconnectée) vers le serveur central afin que la base de données
master soit mise à jour (synchronisation)
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Mode de fonctionnement déconnecté - la déconnexion est une
norme. Ce mode de fonctionnement est préférable pour conserver
une bande passante réseau et une durée de vie élevées.
Réseau non fiable - L’accès au serveur doit être minimisé pour faire
face au taux d’erreur élevé dans un environnement mobile.
Disponibilité limitée de la mémoire - les exigences de traitement
ne devraient pas imposer une charge importante aux ressources
système limitées…
4
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Les applications mobiles fonctionnent mieux lorsqu’elles incluent
une sorte de magasin de données local.
Les opérations sur les données sont plus rapides et peuvent
survenir à tout moment.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Le stockage permanent est un des périphériques de stockage de
données qui conserve les données après la mise hors tension de ce
dernier. Il est également parfois appelé stockage non volatile.
La technologie de l’information permet la réutilisation d’objets
volatiles et d’autres éléments de données en les stockant dans un
système de stockage permanent tel que des fichiers de disque et des
bases de données.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Shared Preferences (préférences partagées): Stocker des données
primitives privées dans des paires clé-valeur.
Internal Storage (Stockage interne): Stocker des données privées
sur la mémoire principale de l’appareil.
External Storage (Stockage externe): Stocker des données
publiques sur un support externe partagé.
SQLite Databases (Base de données SQLite): Stocker des données
structurées localement (privé)
Network Connection (Connexion réseau): Android permet 7de
stocker des fichiers sur un serveur distant.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
On utilise pour cela la notion de « Bundle » et les
Artificial Intelligence a modern approach
différents cycles de l’activité pour sauvegarder
l’information utile à l’aide du « bundle » et
récupérer cette information dans un autre état de
l’activité.
On ne peut utiliser qu’un seul bundle, par
ailleurs la donnée n’est pas persistante et n’est
disponible que tant que l’application est utilisée.
8
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Stockage interne :
Toujours disponible
Artificial Intelligence a modern approach
Par défaut, accessible uniquement par votre application
Fichiers Supprimés à la désinstalla on de l’application
Stockage externe :
Pas toujours disponible (USB, etc.)
Fichiers accessibles et modifiables par tout le monde
Seuls les fichiers du répertoire getExternalFilesDir() sont
supprimés à la désinstalla on de l’application
Nécessite des permissions
Utile pour partager des données entre applications 9
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Il suffit d’ajouter les permissions dans le manifeste
de l’application :
Artificial Intelligence a modern approach
10
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Ces préférences seront accessibles aux différentes
Artificial Intelligence a modern approach
activités associées à l’application.
Les préférences seront utilisées pour sauvegarder
l’état de la configuration de l’application ou bien les
données de session.
Les préférences sont comme les « bundles » sauf
qu’elles sont persistantes ce qui n’est pas le cas des
bundles. 11
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Les préférences ne sont pas cryptées. Il faudra faire
Artificial Intelligence a modern approach
attention si l’intention est de préserver des données
critiques.
Les préférences peuvent être effacées par l’utilisateur de
l’application.
pour sauvegarder puis lire une préférence, il faut utiliser
les méthodes de la classe « SharedPreferences »
12
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Ces préférences sont gérées à travers un code Java ou
Artificial Intelligence a modern approach
bien via une activité.
Les préférences sont adaptées pour des paires simples,
mais dès qu’il est question de données plus complexes,
il est préférable d’utiliser des fichiers (sauvegarder les
préférences dans un fichier).
13
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Les données de ce type de conteneur sont enregistrées en tant que
paires <Key, Value> où la clé est une chaîne et sa valeur associée
doit être un type de données primitif.
Les données sont stockées dans la mémoire principale
interne de l’appareil.
Ils sont généralement utilisés pour conserver les informations d’état
et les données partagées entre plusieurs activités d’une application.
Les conteneurs SharedPreference sont enregistrés en tant que
fichiers XML dans l’espace mémoire interne de l’application.
14
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
L’accès aux préférences partagées
Les préférences partagées peuvent être récupérées en utilisant la
méthode getSharedPreferences().
Création & modification des préférences:
Pour créer ou modifier des préférences, vous devez :
Appeler la méthode edit() sur l’objet SharedPreferences.
Une fois la valeur modifiée, vous devez appeler la méthode
apply() pour l’appliquer de façon asynchrone au système de
fichiers.
L’utilisation de la méthode commit() est déconseillée, car elle
écrit de façon synchrone les changements apportés au système de
15
fichiers.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Tous les types de données primitifs, tels que les booléens,
les flottants, les ints, les longs et les chaînes, sont pris en
Artificial Intelligence a modern approach
charge.
Vous devez mettre les données en clé avec valeur:
editor.putBoolean("key_name", true); // Stockage booléen -
true/false
editor.putString("key_name", "string value"); // Stockage string
editor.putInt("key_name", "int value"); // Stockage integer
editor.putFloat("key_name", "float value"); // Stockage float
editor.putLong("key_name", "long value"); // Stockage long
16
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Commettre des modifications:
commit(): Valide vos modifications de préférences depuis cet
éditeur vers l’objet SharedPreferences qu’il est en train de se
modifier.
Récupération des valeurs des préférences:
Récupérer à partir des préférences enregistrées.
Demander SharedPreferences pas par l’éditeur.
pref.getString("key_name", null); // Obtenir Une chaine
pref.getInt("key_name", null); // Obtenir un entier
pref.getFloat("key_name", null); // Obtenir un réel
pref.getLong("key_name", null); // Obtenir Long
pref.getBoolean("key_name", null); // Obtenir un booléen 17
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Artificial Intelligence a modern approach
18
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Effacer/Supprimer des préférences:
On peut détruire la préférence en détruisant la clé associée à
l’aide de la méthode remove(‘key_name’).
On peut détruire toutes les préférences à l’aide de la méthode
clear () :
editor.removeString(Nom);
editor.clear();
19
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple:
20
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
La méthode getSharedPreferences(...) crée (ou extrait) une table
appelée fichier my_preferred_choices, en utilisant l’accès
MODE_PRIVATE par défaut. Dans ce mode d’accès, seule
l’application appelante peut fonctionner sur le fichier.
Les conteneurs SharedPreference sont enregistrés en tant que
fichiers XML dans l’espace mémoire interne de l’application.
21
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Android offre aussi la possibilité d’utiliser toutes les propriétés
d’une base de données relationnelle.
Android utilise pour cela une base de données basée sur « SQLite »
(www.sqlite.org).
Android stocke la base de données localement à l’application.
Si l’on veut partager cette structure de données avec d’autres
applications, il faudra utiliser dans ce cas, un gestionnaire de
contenu (content provider) configuré à cet effet. 22
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Les opérations sur la base de données se feront
Artificial Intelligence a modern approach
donc dans le même processus que l’application. Il
faudra faire attention aux opérations « lourdes
», votre application va ressentir les contres
coups. Il est conseillé dans ce cas d’utiliser
les tâches asynchrones (ou threads).
Chaque application peut avoir donc ses propres
bases.
Ces bases sont stockées dans le répertoire «
databases » associé à l’application
(/data/data/APP_NAME/databases/nom_base). 23
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Nous pouvons les stocker aussi sur une unité
Artificial Intelligence a modern approach
externe (sdcard).
Chaque base créée, elle le sera en mode «
MODE_PRIVATE ». Aucune autre application ne
peut y accéder que l’application qui l’a créée.
Pour y avoir accès, il faut que la base ait été
sauvegardée sur un support externe, sinon
utiliser le mécanisme d’échange de données
fourni par Android.
24
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Le SQLite peut être utilisé pour:
Créer une base de données
Artificial Intelligence a modern approach
Définir:
Tables SQL
indices
Requêtes (queries)
Vues (views)
Déclencheurs (triggers)
Insérer des lignes
Supprimer les lignes
Changer les lignes
Administrer un fichier de base de données SQLite. 25
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
RDBMS: un système de gestion de base de données relationnelle
(DBMS).
Standard-comliant: implémente la plupart des standards SQL.
Zero configuration: disponible sur tous les appareils Android et ne
nécessite aucune administration de base de données.
Lightweight: apporximativement 350 KB.
Open-source: le code source pour SQLite est dans le domaine
public.
Typeless: SQLite ne vérifie pas le typage des éléments. 26
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
C’est un système compact, très efficace pour les
systèmes embarqués. En effet, il utilise très peu de
mémoire.
Artificial Intelligence a modern approach
SQLite ne nécessite pas de serveur pour fonctionner,
ce qui n’est pas le cas de MySQL par exemple.
27
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Action queries (requête Action) et Retrieval queries représentent
les opérations les plus courantes sur la base de données:
Une requête Action effectue généralement des tâches de
maintenance et d’administration, telles que la manipulation de
tables, d’utilisateurs, d’environnement, etc.
La méthode execSQL (...) manipule les requêtes d’action SQL.
Une requête de récupération est généralement une commande SQL-
Select dans laquelle une table contenant un certain nombre de
champs et de lignes est produite en tant que réponse à une demande
28
de données.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Retrieval queries sont connues comme des instructions
SQL-select.
Answers (résultats) produites par les requêtes de
récupération (Retrieval queries ) sont toujours
conservées dans une table.
Afin de traiter les lignes de table résultantes, l’utilisateur
doit fournir un périphérique de curseur. Les curseurs
autorisent un mécanisme d’accès row-at-time sur les
tables SQL.
rawQuery(): Exécute le code SQL fourni et renvoie un
29
curseur sur l’ensemble de résultats.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Création d’une table:
30
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Insertion:
31
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
La mise à jour d’un enregistrement:
Suppression d’un enregistrement:
32
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple:
Exemple:
Quand .rawQuery() est appelé, le système lie chaque espace réservé vide
33
‘?’ avec la valeur args fournie.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Une autre solution pourrait être utilisée pour l’exemple précédent:
Au lieu que les symboles ‘?’ Agissent comme des espaces réservés, nous
concaténons commodément les fragments de données nécessaires.
34
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Les curseurs sont utilisés pour obtenir un accès séquentiel et
aléatoire aux tables produites par les instructions SQL-select.
Les curseurs permettent de parcourir le résultat d’une requête :
int getCount() ;
boolean moveToFirst() ;
boolean moveToNext() ;
boolean moveToPosition(int position) ;
int getColumnIndex(String columnName)
String getString(int cId) , double getDouble(int cId) ;
void close() ... 35
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Traverser un curseur (Traversing a cursor):
moveToNext (): Déplacez le curseur sur la ligne suivante. Cette
méthode retournera false si le curseur est déjà passé la dernière
entrée dans le jeu de résultats. 36
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple:
37
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Comment stocker des infos structurées dans la
base de données ?
Artificial Intelligence a modern approach
Pour cela, nous allons :
Définir un modèle de données (les tables) ;
Représenter ce modèle sous la forme de classes ;
Définir un SQL pour faciliter la création des tables ;
Voir comment modifier, consulter les données.
38
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Il aide les développeurs non-SQL dans leur processus
d’interrogation d’une base de données.
Les requêtes simples peuvent uniquement récupérer des données à
partir d’une seule table.
La signature de la méthode SQLite .query est:
39
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple:
40
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple: sélection des colonnes: recID, nom et téléphone. La
condition à satisfaire est que recID doit être supérieur à 2, et les
noms doivent commencer par ‘B’ et avoir trois lettres ou plus.
41
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple: combien de groupes d’amis dont recID> 3 ont le même
nom. En outre, nous voulons que les groupes ‘nom’ ne comptent pas
plus de quatre personnes chacun:
42
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple: combien de groupes d’amis dont recID> 3 ont le même
nom. De plus, nous voulons voir des groupes de «nom» n’ayant pas
plus de quatre personnes chacun :
43
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Android fournit un certain nombre de méthodes supplémentaires
pour effectuer des opérations d’insertion, de suppression et de mise
à jour.
Ils renvoient toutes des données de retour, telles que l’ID
d’enregistrement d’une ligne récemment insérée ou le nombre
d’enregistrements affectés par l’action.
44
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Cette classe est utilisée pour stocker un ensemble de paires [nom,
valeur].
Lorsqu’elle est utilisé en combinaison avec SQLite, un objet
ContentValues est simplement un moyen pratique de transmettre un
nombre variable de paramètres aux fonctions d’action SQLite.
Comme les bundles, cette classe prend en charge un groupe de
méthodes put/get pour déplacer des données dans/hors du
conteneur.
45
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
46
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
1. Un ensemble de <Key, value> appelé rowValues est créé et fourni
à la méthode insert(). Chaque ligne de tblAmigo se compose des
colonnes: recID, nom, téléphone.
2. L’enregistrement nouvellement inséré retourne son rowID
3. Un second enregistrement est assemblé et envoyé à la méthode
insert () pour insertion dans tblAmigo. Après qu’il est colocalisé,
il renvoie son rowID.
4. rowValues est réinitialisée, donc rowValues qui n’est pas null
devient vide.
5. SQLite rejette les tentatives d’insertion d’un enregistrement vide
47
renvoyant rowID -1.
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
48
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Où WhereArgs est un tableau d’arguments.
La méthode db.update() tente de mettre à jour tous les enregistrements
dans la table donnée qui satisfont la condition de filtrage définie par la
clause where. Après l’achèvement, elle renvoie le nombre
d’enregistrements affectés par la mise à jour (0 si elle échoue).
Le filtre de mise à jour vérifie que "recID>? and recID <?". Après que les
substitutions d’args sont faites, le nouveau filtre devient: "recID> 249et
recID <7".
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
50
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Exemple:
Une implémentation équivalente utilisant la méthode de
suppression Android :
La méthode renvoie le nombre de lignes supprimées après
l’exécution de la commande (ou 0 s’il n’y en a pas).
51
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
Etendre SQLiteOpenHelper et override (réecrire):
OnCreate()
OnUpgrade()
Définir les champs de base de données, le nom de table et
la version de base de données.
Déclarer helper subclass dans l’objet Activité.
Ouvrir la base de données Readable or Writable
(inscriptible) au besoin.
52
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
public final static int VERSION = 1;
public final static String NAME = "mobile.db";
public final static String TABLE = "CLIENT";
public final static String CID ="CID";
public final static String FIRSTNAME="FIRSTNAME";
public final static String LASTNAME="LASTNAME";
public final static String NOTES="NOTES";
53
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
public class W5DBHelper extends SQLiteOpenHelper
{
public final static int VERSION = 1;
// ... this is where the other constants from the previous slide would go
public W5DBHelper(Context context)
{
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
String sql = "create table " +TABLE +" ("+CID+" integer primary key,
"+FIRSTNAME+" text, "+LASTNAME+" text, "+NOTES+" text);";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("drop table if exists "+TABLE);
onCreate(db);
} 54
}
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018
W5DBHelper helper = new
W5DBHelper(getApplicationContext());
SQLiteDatabase dbHandler = helper.getWritableDatabase();
String sqlInsert = "insert into CLIENT (CID,FIRSTNAME,
LASTNAME, NOTES) values(null,'John','Casey','blah blah
blah');";
dbHandler.execSQL(sqlInsert);
55
UF3: Applications mobiles (APM) Dr. MECHTA Djamila 08/04/2018