SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Samir Akhrouf
Les Bases de Données
Université Mohamed Boudiaf de M’Sila
Faculté des Mathématique et de l’Informatique
Département d’Informatique
Année universitaire
2019-2020
2
Introduction
Une application Android n'est rien de plus qu'une série
d'instructions que le processeur doit exécuter. Les
instructions peuvent servir à entrer des données ou
afficher des résultats.
Nous avons deux opérations importantes:
❑La lecture, c’est-à-dire le chargement en mémoire
centrale et leur stockage sur un support interne
❑L’affichage des résultats après un certain traitement
3
Exemple de stockage en mémoire centrale:
• durant son cycle de vie, une application Android
stocke l’état d’une activité, paused, stopped
pour les restituer lors de son passage à l’état
resumed.
Exemple de stockage définitif:
• stockage de quelques paramètres
• stockage de données dans des fichiers ou bases
de données.
4
Stockage de données
❑ Stockage de données simples indexées par
clés.
❑ Stockage de données dans des fichiers non
structurés
❑ Stockage de données structurées dans une
base de données
I.Stockage de données simples
❑ Un ensemble de chaînes indexées par des clés
❑ Utilisable généralement pour communiquer des
informations entre deux processus, activités, …
5
SharedPreferences: Un ensemble d’API Android permettant de
manipuler des collections basées clés dans une application.
Utilisation de SharedPreferences
SharedPreferences
❑C’est un objet lié à l’application pointant vers un fichier contenant
des collections de données basées clés (key-value pairs).
❑Il fournit un ensemble de méthodes permettant de lire et écrire
leurs contenus
❑Il peut être privé (private) : propre à l’application uniquement ou
partagé (shared) avec d’autres applications.
6
SharedPreferences
❑Création ou accès à un Sharedprefrence
Exemple1 : Plusieurs Sharedprefrence file
Context context = getActivity();
SharedPreferences sharedPref =
context.getSharedPreferences(
getString(R.string.preference_file_key),
Context.MODE_PRIVATE);
Remarque : Le nom doit identifier le Sharedpreference
d’une manière unique (l’associer au package) :
"com.example.myapp.PREFERENCE_FILE_KEY"
7
❑ Création ou accès à un sharedpreference
Exemple2 : Sharedprefernce file par défaut
SharedPreferences sharedPref =
getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences
❑ Lecture d’un sharedpreference
Utiliser les méthodes getInt et getString en donnant
comme paramètres : la clé et éventuellement une valeur
par défaut.
int rang = sharedPref.getInt(“CLE1”, -1);
8
❑Ecriture dans un sharedpreference
❑Créer un éditeur SharedPreferences.Editor en appellant la
méthode edit().
❑Passer les clés et les valeurs associées aux méthodes
d’écriture : putInt(), putString(), …
❑ Appeler la method commit() pour sauvegarder ces valeurs
SharedPreferences
int val = ClaculerScore();
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(“CLE1”, val);
editor.commit();
9
II. Manipulation des fichiers
❑ Un ensemble de données stockées d’une manière
permanente sur un support de stockage.
❑ Comme tout système d’exploitation, Android fournit des
API permettant de manipuler les fichiers:
Actions :
❑Creation
❑Lecture
❑Ecriture
❑Suppression
❑…
10
❑Un objet File permet de manipuler un fichier.
❑Il fournit un ensemble de méthodes permettant de lire
et écrire son contenu.
❑Il peut être privé (private) : propre à l’application
uniquement ou partagé (shared) avec d’autre apps.
❑Il peut être stocké sur Mémoire Interne ou externe.
L’API File
11
Lecture/écriture d’un fichier de la mémoire
externe
<manifest ...>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
<manifest ...>
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
</manifest>
Autorisations :
12
Sauvegarde d’un fichier dans la
mémoire interne
❑Utiliser le répertoire adéquat :
❑getFilesDir() : retourne un objet File représentant le
répertoire interne de l’application
❑getCacheDir() : retourne un objet File représentant le
répertoire interne de l’application pour les fichiers
temporaire.
❑Les fichiers cache doivent être courts et être
supprimés.
13
Sauvegarder un fichier dans la mémoire
interne
❑Création d’un Fichier
Appeler le constructeur File
File file = new File(context.getFilesDir(), filename);
❑ Ecriture dans un Fichier
String filename = "myfile";
String string = "Hello world!";
FileOutputStream outputStream;
try {
outputStream = openFileOutput(filename,
Context.MODE_PRIVATE);
outputStream.write(string.getBytes());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
14
Sauvegarder un fichier dans la mémoire
interne
❑ Création d’un Fichier TEMPORAIRE
File file;
try {
String fileName = “myfiletemp”
file = File.createTempFile(fileName, null,
context.getCacheDir());
catch (IOException e) {
// Error while creating file
}
return file;
15
❑ Vérifier si la mémoire externe est montée:
 getExternalStorageState() : retourne l’état de la mémoire externe.
Etat = Environment.MEDIA_MOUNTED
Sauvegarder un fichier dans la mémoire
externe
getExternalStorageState() : retourne l’état de la mémoire externe.
( Environment.MEDIA_MOUNTED )
Vérifier si la mémoire externe est prête à écrire
(Environment.MEDIA_MOUNTED_READ_ONLY )
16
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read
*/
public boolean isExternalStorageReadable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true;
}
Return false;
}
Sauvegarder un fichier dans la mémoire
externe
17
Un fichier dans la Mem Ext peut être :
❑ Private : supprimés lors de la désinstallation de l’application.
❑ Public : non supprimés lors de la désinstallation de l’application
(Ex. rapports, photo, bdd, ..)
Sauvegarder des fichiers publics
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures
directory.
File file = new
File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
}
❑Environment.DIRECTORY_PICTURES : pour permettre à android
d’organiser les fichiers.
❑ Pour un répertoire quelconque; faites passer null.
18
❑ Sauvegarder des fichiers privés
public File getAlbumStorageDir(String albumName) {
// Get the directory for the user's public pictures
directory. File file = new
File(Environment.getExternalFilesDir(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
Log.e(LOG_TAG, "Directory not created");
}
return file;
❑Environment.DIRECTORY_PICTURES : pour permettre à android
d’organiser les fichiers.
❑ Pour un répertoire quelconque; faites passer null.
❑ Supprimer un fichier dans la mémoire externe
myFile.delete()
❑Avoir de l’espace libre
getFreeSpace() or getTotalSpace()
19
III. Manipulation des Bases de données SQL
❑ Android utilise SQLite3 comme SGBD pour manipuler les BDDs
relationnelles.
❑ SQLite est un SGBD compact convenables aux apps mobiles, mais aussi
utiles pour des BDDs spécifiques dans des apps desktop (Skype, Adobe
Reader, …).
❑ SQLite est fourni dans Android sous forme de bibliothèque d’API utilisable
dans le code client.
❑ Ce n’est pas un serveur auquel on se connecte et on en envoie de
requêtes.
❑ SQL lite API tourne dans le même process que l’application.
❑ Chaque application administre et manipule sa propre base
indépendamment des autres.
20
❑ Une base de donnée SqlLite est un fichier, ayant généralement
l’extension «.db» et créé en mode MODE_PRIVATE
❑ Le fichier est stocke par défaut dans le répertoire:
/data/data/<packagename>/databases/
Pour manipuler une BDD, on doit:
Définir le schéma de notre données
Créer la BDD
Mettre à jour la BDD : select, insert, delete ou update
a. Définition du schéma de la BDD
❑ C’est une déclaration formelle décrivant l’organisation ou la structure
interne de la BDD.
❑ Un schéma de la BDD spécifie sa structure interne en terme de tables et
les relation inter-tables.
❑ Reflétée par l’expression SQL utilisée lors de la création de la BDD.
21
a. Définition du schéma de la BDD
❑ Un schéma de BDD est spécifie en utilisant des « contract classes ».
❑ Un contract class est un conteneur de constantes définissant des Urls, des
tables et des colonnes.
❑ Un contract class doit être crée pour chaque table de la BDD.
22
public final class BookContract {
// To prevent someone from accidentally instantiating the contract
class,
// give it an empty construtor
public BookContract() {}
/* Inner class that defines the table contents */
public static abstract class BookEntry implements BaseColumns {
public static final String TABLE_NAME = “book";
public static final String COLUMN_NAME_BOOK_ID = “bookid";
public static final String COLUMN_NAME_TITLE = "title";
//...
}
}
b. Créer la BDD
❑ La base de donnée est créée en étendant SqlHelper.
❑ On fournit les expressions Sql permettant de créer, supprimer et
mettre à jour la BDD.
23
Public static final String SQL_CREATE_TABLE = "CREATE TABLE " +
BookEntry.TABLE_NAME + " (" +
BookEntry._ID + " INTEGER PRIMARY KEY," +
BookEntry.COLUMN_NAME_BOOK_ID + " TEXT; " +
BookEntry.COLUMN_NAME_TITLE + " TEXT " +
//... Any other options for the CREATE command
" )";
public static final String SQL_DELETE_TABLE =
"DROP TABLE IF EXISTS " + BookEntry.TABLE_NAME;
24
❑ onCreate() : est appelée lors de l’ouverture de la BDD. On doit
installer la BDD dans cet méthode en créant les tables et initialisant
les données.
❑ onUpgrade(), onDowngrade() : est appelée lorsque la version de
l’application est mise à jour pour maintenir la compatibilité.
❑ onOpen() : est appelée lorsque la BDD est ouverte ou mise à jour.
c. manipuler la BDD
❑ La classe SQLiteOpenHelper fournit un ensemble d’APIs pour
manipuler maj de la BDD.
❑ Etendre cette classe et surcharger les mcallback methods :
onCreate(), onUpgrade() et onOpen()
25
public class BooksDbHelper extends SQLiteOpenHelper {
// If you change the database schema, you must increment the database
version. public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = “Books.db";
public BooksDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL(SQL_CREATE_TABLE);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
// This database is only a cache for online data, so its upgrade policy
is
// to simply to discard the data and start over
db.execSQL(SQL_DELETE_TABLE);
onCreate(db);
}
public void onDowngrade(SQLiteDatabase db, int oldVersion, int
newVersion) {
onUpgrade(db, oldVersion, newVersion);
}
}
26
d. Instancier la BDD
BooksDbHelper mDbHelper = new BooksDbHelper(getContext());
❑ Insertion de ligne dans une table
L’insertion dans la BDD se fait en passant un objet ContentValues
à la méthode Insert.
// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(BookEntry.COLUMN_NAME_BOOK_ID , id);
values.put(BookEntry. COLUMN_NAME_BOOK_TITLE , title);
// Insert the new row, returning the primary key value of the new
row long newRowId;
newRowId = db.insert(
BookEntry.TABLE_NAME,
BookEntry.COLUMN_NAME_NULLABLE, values);
27
Insertion de ligne dans une table
newRowId = db.insert(
tablename,
Default_Values,// elsewhere provide null values
);
Lire des info depuis une table
La lecture est basée sur la méthode query ( une requête select)
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// Define a projection that specifies which columns from the
database
// you will actually use after this query. String[] projection = {
BookEntry._ID, BookEntry.COLUMN_NAME_TITLE //,...
};
// How you want the results sorted in the resulting Cursor
String sortOrder = BookEntry.COLUMN_NAME_UPDATED + " DESC";
Cursor c = db.query(
BookEntry.TABLE_NAME, // The table to query
28
projection, // The columns to return
selection, // The columns for the WHERE clause
selectionArgs, // The values for the WHERE clause
null, // don't group the rows
null, // don't filter by row groups
sortOrder // The sort order
);
Lire des info depuis une table
public Cursor query (String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having, String orderBy,
String limit)
29
Paramètres
table String: The table name to compile the query against
columns String: A list of which columns to return. Passing null will return all columns,
which is discouraged to prevent reading data from storage that isn't going to
be used.
selection String: A filter declaring which rows to return, formatted as an SQL WHERE
clause (excluding the WHERE itself). Passing null will return all rows for the
given table.
selectionArgs String: You may include ?s in selection, which will be replaced by the values
from selectionArgs, in order that they appear in the selection. The values will
be bound as Strings.
groupBy String: A filter declaring how to group rows, formatted as an SQL GROUP BY
clause (excluding the GROUP BY itself). Passing null will cause the rows to not
be grouped.
having String: A filter declare which row groups to include in the cursor, if row
grouping is being used, formatted as an SQL HAVING clause (excluding the
HAVING itself). Passing null will cause all row groups to be included, and is
required when row grouping is not being used.
orderBy String: How to order the rows, formatted as an SQL ORDER BY clause (excluding
the ORDER BY itself). Passing null will use the default sort order, which may be
unordered.
limit String: Limits the number of rows returned by the query, formatted as LIMIT
30
Lire des informations depuis une table
Cursor : un ensemble de lignes structurées selon la projection.
Pour les parcourir on utilise les méthodes ‘movXX’ du curseur.
abstract boolean moveToFirst()Move the cursor to the first row.
abstract boolean moveToLast()Move the cursor to the last row.
abstract boolean moveToNext()Move the cursor to the next row.
abstract boolean moveToPosition(int position)Move the cursor to an absolute position.
abstract boolean moveToPrevious()
Lire des informations depuis une table
Récupérer les données en appelant getXX(int index)
Index est l’index du colonne que l’on peut avoir en appelant getColumnIndex
public abstract int getColumnIndex (String columnName)
Renvoie l'index de base zéro pour le nom de la colonne donnée, ou -1 si la
colonne n'existe pas. Si vous êtes certains que la colonne existe, utilisez
getColumnIndexOrThrow(String) instead, which will make the error more clear.
31
public ArrayList<Book> getBooks() {
ArrayList<Book> books= new ArrayList<Book>();
SQLiteDatabase db = getReadableDatabase();
Cursor bookCursor = db.query(BookEntry.TABLE_NAME, null,
null, null, null, null, null);
bookCursor.moveToFirst();
while (bookCursor .moveToNext()) { book
= new Book();
int id = bookCursor.getColumnIndex(BookEntry.COLUMN_NAME_ID)
book.setId(bookCursor.getInt(id);
id = bookCursor.getColumnIndex(BookEntry.COLUMN_NAME_TITLE);
book.setTitle(bookCursor.getString(id));
books.add(book);
}
projCursor.close();
return (books);
}
32
Supprimer des lignes d’une table
❑ Faire une sélection basée sur des colonnes en spécifiant leurs
arguments
// Define 'where' part of query.
String selection = BookEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?";
// Specify arguments in placeholder order.
String[] selectionArgs = { String.valueOf(rowId) };
// Issue SQL statement.
db.delete(table_name, selection, selectionArgs);
33
Modifier une BDD
❑ Combine la syntaxe de Insert et Delete sur une selection
SQLiteDatabase db = mDbHelper.getReadableDatabase();
// New value for one column
ContentValues values = new ContentValues();
values.put(BookEntry.COLUMN_NAME_TITLE, title);
// Which row to update, based on the ID
String selection = BookEntry.COLUMN_NAME_ENTRY_ID + " LIKE
?"; String[] selectionArgs = { String.valueOf(rowId) };
int count = db.update(
booksDbHelper.BookEntry.TABLE_NAME,
values,
selection,
selectionArgs);

Contenu connexe

Similaire à Bases de données sous Android.pdf

Rappels Modularisation application C/C++
Rappels Modularisation application C/C++Rappels Modularisation application C/C++
Rappels Modularisation application C/C++Sylvain Leroy
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linuxKhalid ALLILI
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
GDG Rennes - Bootcamp Initiation Android - Théorie
GDG Rennes - Bootcamp Initiation Android -  ThéorieGDG Rennes - Bootcamp Initiation Android -  Théorie
GDG Rennes - Bootcamp Initiation Android - ThéorieHoracio Gonzalez
 
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyssOWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyssParis Open Source Summit
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework HibernateInes Ouaz
 
Accès aux bases de données via jdbc
Accès aux bases de données via jdbcAccès aux bases de données via jdbc
Accès aux bases de données via jdbcRachid Lajouad
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Corinne Schillinger
 
log file sous Netbeans et J2ME
log file sous Netbeans et J2MElog file sous Netbeans et J2ME
log file sous Netbeans et J2MEZied
 
Maintenance du système Linux
Maintenance du système LinuxMaintenance du système Linux
Maintenance du système LinuxEL AMRI El Hassan
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
#5 Java EE5 Client Lourd et Smart Client
#5 Java EE5  Client Lourd  et Smart Client#5 Java EE5  Client Lourd  et Smart Client
#5 Java EE5 Client Lourd et Smart ClientGuillaume Sauthier
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleThierry Gayet
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataLhouceine OUHAMZA
 

Similaire à Bases de données sous Android.pdf (20)

Rappels Modularisation application C/C++
Rappels Modularisation application C/C++Rappels Modularisation application C/C++
Rappels Modularisation application C/C++
 
Outils front-end
Outils front-endOutils front-end
Outils front-end
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
PostgreSQL sous linux
PostgreSQL sous linuxPostgreSQL sous linux
PostgreSQL sous linux
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Living Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptxLiving Documentation (TDD, BDD).pptx
Living Documentation (TDD, BDD).pptx
 
GDG Rennes - Bootcamp Initiation Android - Théorie
GDG Rennes - Bootcamp Initiation Android -  ThéorieGDG Rennes - Bootcamp Initiation Android -  Théorie
GDG Rennes - Bootcamp Initiation Android - Théorie
 
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyssOWF12/HTML 5 local storage , olivier thomas, cto at webtyss
OWF12/HTML 5 local storage , olivier thomas, cto at webtyss
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework Hibernate
 
openFrameworks
openFrameworksopenFrameworks
openFrameworks
 
Accès aux bases de données via jdbc
Accès aux bases de données via jdbcAccès aux bases de données via jdbc
Accès aux bases de données via jdbc
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
 
log file sous Netbeans et J2ME
log file sous Netbeans et J2MElog file sous Netbeans et J2ME
log file sous Netbeans et J2ME
 
Maintenance du système Linux
Maintenance du système LinuxMaintenance du système Linux
Maintenance du système Linux
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Introduction aspnet
Introduction aspnetIntroduction aspnet
Introduction aspnet
 
#5 Java EE5 Client Lourd et Smart Client
#5 Java EE5  Client Lourd  et Smart Client#5 Java EE5  Client Lourd  et Smart Client
#5 Java EE5 Client Lourd et Smart Client
 
Comprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractibleComprendre les scripts shell auto-extractible
Comprendre les scripts shell auto-extractible
 
Formation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-dataFormation jpa-hibernate-spring-data
Formation jpa-hibernate-spring-data
 

Plus de RihabBENLAMINE

presentationatelierphpprt2-140314143938-phpapp02.pdf
presentationatelierphpprt2-140314143938-phpapp02.pdfpresentationatelierphpprt2-140314143938-phpapp02.pdf
presentationatelierphpprt2-140314143938-phpapp02.pdfRihabBENLAMINE
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfRihabBENLAMINE
 
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdf
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdfCM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdf
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdfRihabBENLAMINE
 
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdfRihabBENLAMINE
 
coursphp-chap3-230321082859-121d6678.pptx
coursphp-chap3-230321082859-121d6678.pptxcoursphp-chap3-230321082859-121d6678.pptx
coursphp-chap3-230321082859-121d6678.pptxRihabBENLAMINE
 
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdfCours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdfRihabBENLAMINE
 
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdf
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdfVirtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdf
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdfRihabBENLAMINE
 
416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdf416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdfRihabBENLAMINE
 
Interace Utilisateur.pdf
Interace Utilisateur.pdfInterace Utilisateur.pdf
Interace Utilisateur.pdfRihabBENLAMINE
 
Environnement Android.pdf
Environnement Android.pdfEnvironnement Android.pdf
Environnement Android.pdfRihabBENLAMINE
 
coursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdfcoursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdfRihabBENLAMINE
 
0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdfRihabBENLAMINE
 
introAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdfintroAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdfRihabBENLAMINE
 
016834638650_suitechap1.pptx
016834638650_suitechap1.pptx016834638650_suitechap1.pptx
016834638650_suitechap1.pptxRihabBENLAMINE
 
Chapitre 04-B - Langages de consultation.pdf
Chapitre 04-B - Langages de consultation.pdfChapitre 04-B - Langages de consultation.pdf
Chapitre 04-B - Langages de consultation.pdfRihabBENLAMINE
 
p01b_portelogique_boole.pdf
p01b_portelogique_boole.pdfp01b_portelogique_boole.pdf
p01b_portelogique_boole.pdfRihabBENLAMINE
 

Plus de RihabBENLAMINE (20)

presentationatelierphpprt2-140314143938-phpapp02.pdf
presentationatelierphpprt2-140314143938-phpapp02.pdfpresentationatelierphpprt2-140314143938-phpapp02.pdf
presentationatelierphpprt2-140314143938-phpapp02.pdf
 
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdfTutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
Tutoriel-PHP-Introduction-à-la-POoooooooooooO.pdf
 
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdf
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdfCM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdf
CM_PHP_PDOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.pdf
 
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
10_interfacesjavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.pdf
 
coursphp-chap3-230321082859-121d6678.pptx
coursphp-chap3-230321082859-121d6678.pptxcoursphp-chap3-230321082859-121d6678.pptx
coursphp-chap3-230321082859-121d6678.pptx
 
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdfCours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
Cours3-PHPfgdwfwdffhddfbwdfwdfwdfwdfwfw.pdf
 
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdf
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdfVirtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdf
Virtualisation & Cloud. Cloud Computing. Iset Siliana RSI3..pdf
 
416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdf416769859360_chap2fondementdesreseaux2023.pdf
416769859360_chap2fondementdesreseaux2023.pdf
 
Interace Utilisateur.pdf
Interace Utilisateur.pdfInterace Utilisateur.pdf
Interace Utilisateur.pdf
 
Firebase.pdf
Firebase.pdfFirebase.pdf
Firebase.pdf
 
Les Activités.pdf
Les Activités.pdfLes Activités.pdf
Les Activités.pdf
 
Environnement Android.pdf
Environnement Android.pdfEnvironnement Android.pdf
Environnement Android.pdf
 
coursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdfcoursphp-230411142526-784b67e9.pdf
coursphp-230411142526-784b67e9.pdf
 
0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf0519-pdf-php-bases-initiation.pdf
0519-pdf-php-bases-initiation.pdf
 
introAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdfintroAndroid_2023_V6.5.2pp1-162.pdf
introAndroid_2023_V6.5.2pp1-162.pdf
 
016834638650_suitechap1.pptx
016834638650_suitechap1.pptx016834638650_suitechap1.pptx
016834638650_suitechap1.pptx
 
PHP_intro.pdf
PHP_intro.pdfPHP_intro.pdf
PHP_intro.pdf
 
Chapitre 04-B - Langages de consultation.pdf
Chapitre 04-B - Langages de consultation.pdfChapitre 04-B - Langages de consultation.pdf
Chapitre 04-B - Langages de consultation.pdf
 
chapitre-2.pptx.pdf
chapitre-2.pptx.pdfchapitre-2.pptx.pdf
chapitre-2.pptx.pdf
 
p01b_portelogique_boole.pdf
p01b_portelogique_boole.pdfp01b_portelogique_boole.pdf
p01b_portelogique_boole.pdf
 

Bases de données sous Android.pdf

  • 1. Samir Akhrouf Les Bases de Données Université Mohamed Boudiaf de M’Sila Faculté des Mathématique et de l’Informatique Département d’Informatique Année universitaire 2019-2020
  • 2. 2 Introduction Une application Android n'est rien de plus qu'une série d'instructions que le processeur doit exécuter. Les instructions peuvent servir à entrer des données ou afficher des résultats. Nous avons deux opérations importantes: ❑La lecture, c’est-à-dire le chargement en mémoire centrale et leur stockage sur un support interne ❑L’affichage des résultats après un certain traitement
  • 3. 3 Exemple de stockage en mémoire centrale: • durant son cycle de vie, une application Android stocke l’état d’une activité, paused, stopped pour les restituer lors de son passage à l’état resumed. Exemple de stockage définitif: • stockage de quelques paramètres • stockage de données dans des fichiers ou bases de données.
  • 4. 4 Stockage de données ❑ Stockage de données simples indexées par clés. ❑ Stockage de données dans des fichiers non structurés ❑ Stockage de données structurées dans une base de données I.Stockage de données simples ❑ Un ensemble de chaînes indexées par des clés ❑ Utilisable généralement pour communiquer des informations entre deux processus, activités, …
  • 5. 5 SharedPreferences: Un ensemble d’API Android permettant de manipuler des collections basées clés dans une application. Utilisation de SharedPreferences SharedPreferences ❑C’est un objet lié à l’application pointant vers un fichier contenant des collections de données basées clés (key-value pairs). ❑Il fournit un ensemble de méthodes permettant de lire et écrire leurs contenus ❑Il peut être privé (private) : propre à l’application uniquement ou partagé (shared) avec d’autres applications.
  • 6. 6 SharedPreferences ❑Création ou accès à un Sharedprefrence Exemple1 : Plusieurs Sharedprefrence file Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE); Remarque : Le nom doit identifier le Sharedpreference d’une manière unique (l’associer au package) : "com.example.myapp.PREFERENCE_FILE_KEY"
  • 7. 7 ❑ Création ou accès à un sharedpreference Exemple2 : Sharedprefernce file par défaut SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences ❑ Lecture d’un sharedpreference Utiliser les méthodes getInt et getString en donnant comme paramètres : la clé et éventuellement une valeur par défaut. int rang = sharedPref.getInt(“CLE1”, -1);
  • 8. 8 ❑Ecriture dans un sharedpreference ❑Créer un éditeur SharedPreferences.Editor en appellant la méthode edit(). ❑Passer les clés et les valeurs associées aux méthodes d’écriture : putInt(), putString(), … ❑ Appeler la method commit() pour sauvegarder ces valeurs SharedPreferences int val = ClaculerScore(); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(“CLE1”, val); editor.commit();
  • 9. 9 II. Manipulation des fichiers ❑ Un ensemble de données stockées d’une manière permanente sur un support de stockage. ❑ Comme tout système d’exploitation, Android fournit des API permettant de manipuler les fichiers: Actions : ❑Creation ❑Lecture ❑Ecriture ❑Suppression ❑…
  • 10. 10 ❑Un objet File permet de manipuler un fichier. ❑Il fournit un ensemble de méthodes permettant de lire et écrire son contenu. ❑Il peut être privé (private) : propre à l’application uniquement ou partagé (shared) avec d’autre apps. ❑Il peut être stocké sur Mémoire Interne ou externe. L’API File
  • 11. 11 Lecture/écriture d’un fichier de la mémoire externe <manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest> <manifest ...> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ... </manifest> Autorisations :
  • 12. 12 Sauvegarde d’un fichier dans la mémoire interne ❑Utiliser le répertoire adéquat : ❑getFilesDir() : retourne un objet File représentant le répertoire interne de l’application ❑getCacheDir() : retourne un objet File représentant le répertoire interne de l’application pour les fichiers temporaire. ❑Les fichiers cache doivent être courts et être supprimés.
  • 13. 13 Sauvegarder un fichier dans la mémoire interne ❑Création d’un Fichier Appeler le constructeur File File file = new File(context.getFilesDir(), filename); ❑ Ecriture dans un Fichier String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
  • 14. 14 Sauvegarder un fichier dans la mémoire interne ❑ Création d’un Fichier TEMPORAIRE File file; try { String fileName = “myfiletemp” file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Error while creating file } return file;
  • 15. 15 ❑ Vérifier si la mémoire externe est montée:  getExternalStorageState() : retourne l’état de la mémoire externe. Etat = Environment.MEDIA_MOUNTED Sauvegarder un fichier dans la mémoire externe getExternalStorageState() : retourne l’état de la mémoire externe. ( Environment.MEDIA_MOUNTED ) Vérifier si la mémoire externe est prête à écrire (Environment.MEDIA_MOUNTED_READ_ONLY )
  • 16. 16 public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } Return false; } Sauvegarder un fichier dans la mémoire externe
  • 17. 17 Un fichier dans la Mem Ext peut être : ❑ Private : supprimés lors de la désinstallation de l’application. ❑ Public : non supprimés lors de la désinstallation de l’application (Ex. rapports, photo, bdd, ..) Sauvegarder des fichiers publics public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; } ❑Environment.DIRECTORY_PICTURES : pour permettre à android d’organiser les fichiers. ❑ Pour un répertoire quelconque; faites passer null.
  • 18. 18 ❑ Sauvegarder des fichiers privés public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; ❑Environment.DIRECTORY_PICTURES : pour permettre à android d’organiser les fichiers. ❑ Pour un répertoire quelconque; faites passer null. ❑ Supprimer un fichier dans la mémoire externe myFile.delete() ❑Avoir de l’espace libre getFreeSpace() or getTotalSpace()
  • 19. 19 III. Manipulation des Bases de données SQL ❑ Android utilise SQLite3 comme SGBD pour manipuler les BDDs relationnelles. ❑ SQLite est un SGBD compact convenables aux apps mobiles, mais aussi utiles pour des BDDs spécifiques dans des apps desktop (Skype, Adobe Reader, …). ❑ SQLite est fourni dans Android sous forme de bibliothèque d’API utilisable dans le code client. ❑ Ce n’est pas un serveur auquel on se connecte et on en envoie de requêtes. ❑ SQL lite API tourne dans le même process que l’application. ❑ Chaque application administre et manipule sa propre base indépendamment des autres.
  • 20. 20 ❑ Une base de donnée SqlLite est un fichier, ayant généralement l’extension «.db» et créé en mode MODE_PRIVATE ❑ Le fichier est stocke par défaut dans le répertoire: /data/data/<packagename>/databases/ Pour manipuler une BDD, on doit: Définir le schéma de notre données Créer la BDD Mettre à jour la BDD : select, insert, delete ou update a. Définition du schéma de la BDD ❑ C’est une déclaration formelle décrivant l’organisation ou la structure interne de la BDD. ❑ Un schéma de la BDD spécifie sa structure interne en terme de tables et les relation inter-tables. ❑ Reflétée par l’expression SQL utilisée lors de la création de la BDD.
  • 21. 21 a. Définition du schéma de la BDD ❑ Un schéma de BDD est spécifie en utilisant des « contract classes ». ❑ Un contract class est un conteneur de constantes définissant des Urls, des tables et des colonnes. ❑ Un contract class doit être crée pour chaque table de la BDD.
  • 22. 22 public final class BookContract { // To prevent someone from accidentally instantiating the contract class, // give it an empty construtor public BookContract() {} /* Inner class that defines the table contents */ public static abstract class BookEntry implements BaseColumns { public static final String TABLE_NAME = “book"; public static final String COLUMN_NAME_BOOK_ID = “bookid"; public static final String COLUMN_NAME_TITLE = "title"; //... } } b. Créer la BDD ❑ La base de donnée est créée en étendant SqlHelper. ❑ On fournit les expressions Sql permettant de créer, supprimer et mettre à jour la BDD.
  • 23. 23 Public static final String SQL_CREATE_TABLE = "CREATE TABLE " + BookEntry.TABLE_NAME + " (" + BookEntry._ID + " INTEGER PRIMARY KEY," + BookEntry.COLUMN_NAME_BOOK_ID + " TEXT; " + BookEntry.COLUMN_NAME_TITLE + " TEXT " + //... Any other options for the CREATE command " )"; public static final String SQL_DELETE_TABLE = "DROP TABLE IF EXISTS " + BookEntry.TABLE_NAME;
  • 24. 24 ❑ onCreate() : est appelée lors de l’ouverture de la BDD. On doit installer la BDD dans cet méthode en créant les tables et initialisant les données. ❑ onUpgrade(), onDowngrade() : est appelée lorsque la version de l’application est mise à jour pour maintenir la compatibilité. ❑ onOpen() : est appelée lorsque la BDD est ouverte ou mise à jour. c. manipuler la BDD ❑ La classe SQLiteOpenHelper fournit un ensemble d’APIs pour manipuler maj de la BDD. ❑ Etendre cette classe et surcharger les mcallback methods : onCreate(), onUpgrade() et onOpen()
  • 25. 25 public class BooksDbHelper extends SQLiteOpenHelper { // If you change the database schema, you must increment the database version. public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = “Books.db"; public BooksDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_TABLE); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // This database is only a cache for online data, so its upgrade policy is // to simply to discard the data and start over db.execSQL(SQL_DELETE_TABLE); onCreate(db); } public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { onUpgrade(db, oldVersion, newVersion); } }
  • 26. 26 d. Instancier la BDD BooksDbHelper mDbHelper = new BooksDbHelper(getContext()); ❑ Insertion de ligne dans une table L’insertion dans la BDD se fait en passant un objet ContentValues à la méthode Insert. // Gets the data repository in write mode SQLiteDatabase db = mDbHelper.getWritableDatabase(); // Create a new map of values, where column names are the keys ContentValues values = new ContentValues(); values.put(BookEntry.COLUMN_NAME_BOOK_ID , id); values.put(BookEntry. COLUMN_NAME_BOOK_TITLE , title); // Insert the new row, returning the primary key value of the new row long newRowId; newRowId = db.insert( BookEntry.TABLE_NAME, BookEntry.COLUMN_NAME_NULLABLE, values);
  • 27. 27 Insertion de ligne dans une table newRowId = db.insert( tablename, Default_Values,// elsewhere provide null values ); Lire des info depuis une table La lecture est basée sur la méthode query ( une requête select) SQLiteDatabase db = mDbHelper.getReadableDatabase(); // Define a projection that specifies which columns from the database // you will actually use after this query. String[] projection = { BookEntry._ID, BookEntry.COLUMN_NAME_TITLE //,... }; // How you want the results sorted in the resulting Cursor String sortOrder = BookEntry.COLUMN_NAME_UPDATED + " DESC"; Cursor c = db.query( BookEntry.TABLE_NAME, // The table to query
  • 28. 28 projection, // The columns to return selection, // The columns for the WHERE clause selectionArgs, // The values for the WHERE clause null, // don't group the rows null, // don't filter by row groups sortOrder // The sort order ); Lire des info depuis une table public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
  • 29. 29 Paramètres table String: The table name to compile the query against columns String: A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used. selection String: A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table. selectionArgs String: You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings. groupBy String: A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped. having String: A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used. orderBy String: How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered. limit String: Limits the number of rows returned by the query, formatted as LIMIT
  • 30. 30 Lire des informations depuis une table Cursor : un ensemble de lignes structurées selon la projection. Pour les parcourir on utilise les méthodes ‘movXX’ du curseur. abstract boolean moveToFirst()Move the cursor to the first row. abstract boolean moveToLast()Move the cursor to the last row. abstract boolean moveToNext()Move the cursor to the next row. abstract boolean moveToPosition(int position)Move the cursor to an absolute position. abstract boolean moveToPrevious() Lire des informations depuis une table Récupérer les données en appelant getXX(int index) Index est l’index du colonne que l’on peut avoir en appelant getColumnIndex public abstract int getColumnIndex (String columnName) Renvoie l'index de base zéro pour le nom de la colonne donnée, ou -1 si la colonne n'existe pas. Si vous êtes certains que la colonne existe, utilisez getColumnIndexOrThrow(String) instead, which will make the error more clear.
  • 31. 31 public ArrayList<Book> getBooks() { ArrayList<Book> books= new ArrayList<Book>(); SQLiteDatabase db = getReadableDatabase(); Cursor bookCursor = db.query(BookEntry.TABLE_NAME, null, null, null, null, null, null); bookCursor.moveToFirst(); while (bookCursor .moveToNext()) { book = new Book(); int id = bookCursor.getColumnIndex(BookEntry.COLUMN_NAME_ID) book.setId(bookCursor.getInt(id); id = bookCursor.getColumnIndex(BookEntry.COLUMN_NAME_TITLE); book.setTitle(bookCursor.getString(id)); books.add(book); } projCursor.close(); return (books); }
  • 32. 32 Supprimer des lignes d’une table ❑ Faire une sélection basée sur des colonnes en spécifiant leurs arguments // Define 'where' part of query. String selection = BookEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?"; // Specify arguments in placeholder order. String[] selectionArgs = { String.valueOf(rowId) }; // Issue SQL statement. db.delete(table_name, selection, selectionArgs);
  • 33. 33 Modifier une BDD ❑ Combine la syntaxe de Insert et Delete sur une selection SQLiteDatabase db = mDbHelper.getReadableDatabase(); // New value for one column ContentValues values = new ContentValues(); values.put(BookEntry.COLUMN_NAME_TITLE, title); // Which row to update, based on the ID String selection = BookEntry.COLUMN_NAME_ENTRY_ID + " LIKE ?"; String[] selectionArgs = { String.valueOf(rowId) }; int count = db.update( booksDbHelper.BookEntry.TABLE_NAME, values, selection, selectionArgs);