SlideShare ist ein Scribd-Unternehmen logo
1 von 94
Downloaden Sie, um offline zu lesen
session sept 2014 Yann Caron (c) 2014 1
IN01
Programmation Android
04 – Bases de données
Yann Caron
session sept 2014 Yann Caron (c) 2014 2
Sommaire - Séance 04
 Rappel sur les SGBD
 Couches logiciels
 SQLite
 Object Relational Mapping
 NoSQL - OODBMS - DB4Object
session sept 2014 Yann Caron (c) 2014 3
IN01 – Séance 04
Rappel sur les SGBD
session sept 2014 Yann Caron (c) 2014 4
Les bases de données

Wiki : une base de données est un magasin de
données composé de plusieurs fichiers manipulés
exclusivement par le SGBD

Ce dernier cache la complexité de manipulation
des structures de la base de données en mettant à
disposition une vue synthétique du contenu

Les SGBD sont les logiciels intermédiaires entre les
utilisateurs et les bases de données
session sept 2014 Yann Caron (c) 2014 5
Exigences d'un SGBD

Stocker des données, les modifier

Un processus d'interrogation et de recherche des
données selon un ou plusieurs critères

Pouvoir créer des sauvegardes et les restaurer si besoin

Application de règles pour assurer la cohérence des
données (selon les relations entre elles)

Sécurité : un processus d'authentification pour protéger
les données
session sept 2014 Yann Caron (c) 2014 6
Exigences d'un SGBD

Abstraire la couche de stockage et les
processus de requêtage

Logging : track les modifications effectuées
par les utilisateurs

Optimisation : performance tuning
session sept 2014 Yann Caron (c) 2014 7
ACID

Lors d'une manipulation des données, il faut toujours
s'assurer que la base de données conserve son intégrité

Une transaction (modification bornée) doit être :
➔
Atomique : la suite des opérations est indivisible (synchronized)
➔
Cohérente : le contenu FINAL doit être cohérent, même si les
étapes intermédiaires ne le sont pas
➔
Isolée : pas d'interaction entre des transactions concurrentes
➔
Durable : une fois validé, l'état devient permanent et aucun
incident technique ne doit altérer le résultat d'une transaction
session sept 2014 Yann Caron (c) 2014 8
CRUD

Opérations de base dans un SGBD

Create, Read, Update, Delete
Operation SQL HTTP DB4O
Create INSERT POST .store
Read
(Retrieve)
SELECT GET .queryByExample
.AsQueryable
Update UPDATE PUT / PATCH .store
Delete DELETE DELETE .delete
session sept 2014 Yann Caron (c) 2014 9
SGBDR

Système de gestion de bases de données
relationnelles

Relations :
➔
One to one
➔
One to many
➔
Many to many

Normalisation
session sept 2014 Yann Caron (c) 2014 10
Bibliothèque
Book
title : nvarchar
isbn : nvarchar
nbPage : int
Book
title isbn nbPage
Croc blanc 2010034031 248
Vingt mille lieues sous les mers 353
session sept 2014 Yann Caron (c) 2014 11
Bibliothèque MCD
Book Genre
Author
Customer belongs to
written by
borrown n 1 n
1
n
session sept 2014 Yann Caron (c) 2014 12
Bibliothèque MLD
Book Genre
Author
Customer n n 1 n
1
n
borrow 11
fromDate toDate
session sept 2014 Yann Caron (c) 2014 13
Queries

Tous les livres dont le nom commence par la
lettre “a”
➔ SELECT * FROM Book WHERE name LIKE 'A
%'

Tous les livres du même auteur
➔ SELECT * FROM Book b INNER JOIN Author
a ON b.idAuthor = a.id WHERE a.name =
'Jack London'
session sept 2014 Yann Caron (c) 2014 14
Ensembles

Sous-ensembles résultant de la jointure
A
1
2
3
4
B
3
4
7
8
FULL
JOIN
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
=
session sept 2014 Yann Caron (c) 2014 15
Ensembles
Inner Join
SELECT * FROM A
INNER JOIN B
ON A.key = B.key
Full Join
SELECT * FROM A
FULL JOIN B
ON A.key = B.key
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
session sept 2014 Yann Caron (c) 2014 16
Ensembles
Full Join
Sans intersection
SELECT * FROM A
FULL JOIN B
ON A.key = B.key
WHERE A.key IS NULL
OR B.key IS NULL
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
session sept 2014 Yann Caron (c) 2014 17
Ensembles Left
Left Join
SELECT *
FROM A
LEFT JOIN B
ON A.key = B.key
Left Join
sans intersection
SELECT *
FROM A
LEFT JOIN B
ON A.key = B.key
WHERE B.key IS NULL
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
session sept 2014 Yann Caron (c) 2014 18
Ensembles Right
Right Join
SELECT *
FROM A
RIGHT JOIN B
ON A.key = B.key
Right Join
sans intersection
SELECT *
FROM A
RIGHT JOIN B
ON A.key = B.key
WHERE A.key IS NULL
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
A B
1 NULL
2 NULL
3 3
4 4
NULL 7
NULL 8
session sept 2014 Yann Caron (c) 2014 19
Ensembles

Ne pas confondre avec le produit cartésien

Le résultat est l'ensemble de tous les couples
(distribution)
SELECT * FROM A CROSS JOIN B
session sept 2014 Yann Caron (c) 2014 20
CRUD - SQL98

Create :
➔ INSERT INTO Books (title, isbn, nbPage) VALUES
(“Croc blanc”, “2010034031”, 248)

Read :
➔ SELECT * FROM Books WHERE title = “Croc blanc”

Update :
➔ UPDATE Books SET nbPage = 248 WHERE title = “Croc
blanc”

Delete :
➔ DELETE FROM Books WHERE title = “Croc blanc”
session sept 2014 Yann Caron (c) 2014 21
IN01 – Séance 04
Couches logiciels
session sept 2014 Yann Caron (c) 2014 22
Patron - Layer

POSA : Pattern Oriented Software Architecture

Architecturer les applications en couches

Chaque couche a son niveau d'abstraction propre

Séparation des responsabilités par niveau
d'abstraction

Rend interchangeables les différentes couches

exemple : couches OSI (réseau)
session sept 2014 Yann Caron (c) 2014 23
Patron – Layer – Exemple
Data Access Layer
Data
Transfert
Objects
Logger
Business Model
View
FishDb4o
FishDAO (CRUD)
FamilyDb4o
FamilyDAO (CRUD)
db4o
FishBO FamilyBO
FishView FamilyView
Fish
Familly
1..1
Fish
session sept 2014 Yann Caron (c) 2014 24
Patron - Layer

La couche L

Elle offre un service à la couche supérieure
(L+1)

Elle délègue les sous-tâches à la couche
inférieure (L–1)

Elle ne collabore qu'avec la couche
inférieure (L-1)
session sept 2014 Yann Caron (c) 2014 25
Patron - Layer

Communications descendantes directes
(création d'objets, appel de méthodes)
➔
White boxe, les objets sont accessibles
➔
Black boxe, les objets sont utilisés au travers d'un
adapter et/ou des interfaces

Communications ascendantes découplées
(callback, observer/observable, template method
– choix pour Algoid)
session sept 2014 Yann Caron (c) 2014 26
DTO – Data Transfert Object

Ensemble de POJO (Plain Old Java Object)
représente le modèle business

Pour chaque table de la DB = 1 POJO (bean)

Un bean mutable (attributs privés, getters,
setters, constructeur par défaut – state less,
constructeur avec assignation des attributs –
state full…)
session sept 2014 Yann Caron (c) 2014 27
Un design pattern : DAO

Data Access Object

Une interface CRUD : avec les méthodes de
création, lecture, modification et suppression

Permet une séparation des responsabilités
entre les objets métier et l'accès à la base de
données

1 table = 1 DAO = 1 DTO (bean)
session sept 2014 Yann Caron (c) 2014 28
Un design pattern : DAO
Objets métier SGBDDAO
Data access abstraction
POJO
Interface
DAO
DAO interface
DAO interface
create ()
selectAll ()
select ()
update ()
delete ()
Tables
Factory
session sept 2014 Yann Caron (c) 2014 29
ORM

Object Relational Mapping

Un framework qui le fait pour nous

Transforme les objets en tables et vice versa, les attributs en champs.

Correspondance des types (Java/SQLite)

Plusieurs modes de configuration : XML, paramétrisation, annotations

Un grand nombre d'ORM sur le marché : Hibernate, OJB, SimpleORM,
ORMLite, Nhibernate, Entity Framework, Linq To SQL

Une problématique répandue
session sept 2014 Yann Caron (c) 2014 30
Autres possibilités

Systèmes NoSQL (Not Only SQL)

Document-oriented database system
➔
Basé sur des standards de description de documents : XML, YAML,
JSON (JavaScript Object Notation), BSON (Binary JSON)
➔
Informix, MongoDB, OrientDB, Cassandra

Graphs-oriented database system

OODBMS
➔
Object oriented database management system
➔
DB4O, une base de données embarquable sur Android
session sept 2014 Yann Caron (c) 2014 31
Différentes approches de la
persistance
session sept 2014 Yann Caron (c) 2014 32
SGBDOO - Avantages

Bénéficie de la puissance et de la flexibilité de
l'objet (avec les objets, on peut tout représenter)

Pas de mapping

Relation n/n (many to many) native

Héritage

Patron Composite

Découplage des complexités
session sept 2014 Yann Caron (c) 2014 33
Inconvénients

Limites des SGBDOO :
➔
Méconnues
➔
Manque de standardisation malgré l’ODMG (accès multiples)
➔
Peu d'interopérabilité avec les BDR et les outils (OLAP, reporting)
➔
Toutes n’implémentent pas encore le backup incrémental
➔
Coût de migration élevé

Limitations peu importantes pour une DB embarquée sur
Android, n'est-ce pas ?
session sept 2014 Yann Caron (c) 2014 34
IN01 – Séance 04
SQLite
session sept 2014 Yann Caron (c) 2014 35
SQLite

Moteur de base de données relationnelle

Crée par D.Richard Hipp

Écrit en C (ANSI-C)

Open source sans restriction

Multiplate-forme

Le plus distribué au monde (Firefox, Skype, Google Gears)

Systèmes embarqués (iPhone, Symbian, Android, mais pas
sur Windows Phone)
session sept 2014 Yann Caron (c) 2014 36
SQLite

Implémente le standard SQL-92 (alias SQL2)

Et les propriétés ACID

SGBD embarqué

Pas de gestion des droits (mono-utilisateur)

Pas de configuration
session sept 2014 Yann Caron (c) 2014 37
Embarqué

Fichiers simples, Modèle embarqué, Modèle
client-serveur (n-tiers)
Espace application
Application
SQLite
Données
Espace application
Application
Données
Espace application
Application
Client
Données
SGBD
session sept 2014 Yann Caron (c) 2014 38
Patron – Layer – Exemple
Data Access Layer
Data
Transfert
Objects
Logger
Business Model
View
FishDb4o
FishDAO (CRUD)
FamilyDb4o
FamilyDAO (CRUD)
db4o
FishBO FamilyBO
FishView FamilyView
Fish
Familly
1..1
session sept 2014 Yann Caron (c) 2014 39
Mais…

Dépendant du système de fichier

une base de données = un fichier

Attention à la limite sur des DD formatés en FAT 32

Pas d'extension propre, (“.sqlite”, “.db” sont de bonnes
pratiques)

Possibilité de sauvegarde en mémoire vive (extension
“:memory:”)

Objectif : remplacer le système de fichiers, mais pas les SGBDR
session sept 2014 Yann Caron (c) 2014 40
Compilation
Architecture

Virtual Machine ?

OpCode (137
instructions)

Arbre-B ?

Abstraction
matérielle
Interface (API)
Lexer
Machine virtuelle
Parser
CodeGen (opCode)
Ressources(Android)
Abstraction matérielle
Cacher
Gestionnaire B-Tree
session sept 2014 Yann Caron (c) 2014 41
Notre bibliothèque avec SQLite

Le POJO Book

Un objet qui
représente un
record “livre”

Des attributs,
des accesseurs,
un constructeur
stateless et un
statefull
public class Book {
// attributes
private int id;
private String title;
private String isbn;
private int nbPage;
// accessors
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
// etc.
// constructor
public Book(int id) {
super(id);
}
public Book(int id, String title, String isbn, int nbPage) {
this(id);
this.title = title;
this.isbn = isbn;
this.nbPage = nbPage;
}
}
session sept 2014 Yann Caron (c) 2014 42
Création de la base

Il faut fournir une classe qui a pour
responsabilité la création de la base et la mise
à jour du schéma
public class LibraryDBHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
session sept 2014 Yann Caron (c) 2014 43
Création de la base

Une classe abstraite : SQLiteOpenHelper

Design pattern : Template method (GoF)

Un constructeur : données utiles

Deux méthodes abstraites :
➔
onCreate : chargée de la création de la DB
➔
onUpgrade : chargée de la mise à jour du schéma
(en général, on efface tout et on recommence)
session sept 2014 Yann Caron (c) 2014 44
Constructeur

Le context Android

Le nom du fichier

Le créateur de curseur (null par défaut)

La version

Un handler en cas de corruption de la base (par défaut)
public static final String DB_NAME = "Library.db";
public static final int DB_VERSION = 5;
// constructor
public LibraryDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
session sept 2014 Yann Caron (c) 2014 45
Création et Upgrade
public class LibraryDBHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "Library.db";
public static final int DB_VERSION = 5;
public static String getQueryCreate() {
return "CREATE TABLE Book ("
+ "id Integer PRIMARY KEY AUTOINCREMENT, "
+ "title Text NOT NULL, "
+ "isbn Text NOT NULL, "
+ "nbPage Integer NOT NULL"
+ ");";
}
public static String getQueryDrop() {
return "DROP TABLE IF EXISTS Book;";
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(getQueryCreate());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(getQueryDrop());
db.execSQL(getQueryCreate());
}
}
Crée les tables
Recrée les tables
session sept 2014 Yann Caron (c) 2014 46
Gestion plus fine de l'upgrade

Des petits pas jusqu'à la version courante
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Management by successive upgrades
// newVersion is 4 !
int delta = newVersion - oldVersion;
if (delta >= 3) {
// upgrate to version 2
}
if (delta >= 2) {
// upgrate to version 3
}
if (delta >= 1) {
// upgrate to version 4
}
}
Gère les changements
étape par étape
session sept 2014 Yann Caron (c) 2014 47
Datasource

Une classe responsable de l'accès à la base de
données

Responsable de créer le helper

Ouvrir (open())/Fermer (close())/Donner
accès aux données (getDB())

Factory des différents DAO
session sept 2014 Yann Caron (c) 2014 48
Datasource

Crée le helper

Accès à la db

Ouvre et ferme
la connexion

Les factories
public class LibraryDataSource {
private final LibraryDBHelper helper;
private SQLiteDatabase db;
public LibraryDataSource(Context context) {
helper = new LibraryDBHelper(context);
}
public SQLiteDatabase getDB() {
if (db == null) open(); // lazy initialization
return db;
}
public void open() throws SQLException {
db = helper.getWritableDatabase();
}
public void close() {
helper.close();
}
// factories
public BookDAO newBookDAO() {
return new BookDAO(this); // flyweight ?
}
}
Accès à la base
DAO factories
session sept 2014 Yann Caron (c) 2014 49
DAO et CRUD

Référence la datasource

Create() : crée le record à partir du POJO, gestion de
son nouvel ID

Read() : lit le record selon l'ID et charge ses champs
avec les valeurs de la DB

Update() : met à jour les valeurs de la base à partir du
POJO

Delete() : supprime le record selon l'ID du POJO
session sept 2014 Yann Caron (c) 2014 50
Écrire la donnée

Une classe android.content.ContentValues

Tableau associatif (Set)
➔
Clé : nom du champ en base
➔
Valeur : valeur de la donnée dans le POJO

Une méthode put(String key, ???? value) pour
créer l'association (overload sur chaque type)

Des méthodes pour récupérer les valeurs selon les clés
(getAsInteger(), getAsDouble()…)
session sept 2014 Yann Caron (c) 2014 51
Méthode create() du DAO

Crée le tableau associatif avec les valeurs du
POJO

Exécute la requête d'insertion

Met à jour l'ID

Retourne le POJO
mis à jour
Public synchronized Book create(Book POJO) {
// create associative array
ContentValues values = new ContentValues();
values.put(COL_TITLE, POJO.getTitle());
values.put(COL_ISBN, POJO.getIsbn());
values.put(COL_NBPAGE, POJO.getNbPage());
// insert query
int id = (int) getDB().insert(TABLE_NAME, null, values);
// update id into POJO
POJO.setId(id);
return POJO;
}
Tableau
associatif
API level
session sept 2014 Yann Caron (c) 2014 52
Méthode update() du DAO

Le même principe que l'insert

La clause en plus
Public synchronized Book update(Book POJO) {
// create associative array
ContentValues values = new ContentValues();
values.put(COL_TITLE, POJO.getTitle());
values.put(COL_ISBN, POJO.getIsbn());
values.put(COL_NBPAGE, POJO.getNbPage());
// where clause
String clause = COL_ID + " = ?";
String[] clauseArgs = new String[]{String.valueOf(POJO.getId())};
// update
getDB().update(TABLE_NAME, values, clause, clauseArgs);
// return the POJO
return POJO;
}
Expression de recherche
session sept 2014 Yann Caron (c) 2014 53
Méthode delete() du DAO

Que la clause where, cette fois-ci !
Public synchronized void delete(Book POJO) {
// where clause
String clause = COL_ID + " = ?";
String[] clauseArgs = new String[]{String.valueOf(POJO.getId())};
// delete
getDB().delete(TABLE_NAME, clause, clauseArgs);
}
session sept 2014 Yann Caron (c) 2014 54
Lire la donnée

Deux méthodes :
➔ rawQuery (String query, String[] args)

Remplace les caractères “?” par les valeurs passées en argument

ex. : rawQuery(“SELECT * FROM book WHERE id = ?”, 1);
➔ query (String tableName, String[] columns,
String clause, String[] args, String groupBy,
String having, String orderBy)
➔
Idée, le moins de SQL possible dans le code

Pourquoi pas un design pattern de Builder ou Interpreter ?
session sept 2014 Yann Caron (c) 2014 55
Cursor

La classe android.database.Cursor

Un design pattern Iterator

Sur une collection d'éléments typés (mais pas
nommés)
session sept 2014 Yann Caron (c) 2014 56
Méthode read() du DAO
public Book read(Book POJO) {
// columns
String[] allColumns = new String[]{COL_ID, COL_TITLE, COL_ISBN, COL_NBPAGE};
// clause
String clause = COL_ID + " = ?";
String[] clauseArgs = new String[]{String.valueOf(POJO.getId())};
// select query
Cursor cursor = getDB().query(TABLE_NAME, allColumns, "ID = ?", clauseArgs, null, null, null);
// read cursor
cursor.moveToFirst();
POJO.setTitle(cursor.getString(1));
POJO.setIsbn(cursor.getString(2));
POJO.setNbPage(cursor.getInt(3));
cursor.close();
return POJO;
}
Expression de recherche
Requête
Chargement du POJO
session sept 2014 Yann Caron (c) 2014 57
Méthode readAll() du DAO
public List<Book> readAll() {
// columns
String[] allColumns = new String[]{COL_ID, COL_TITLE, COL_ISBN, COL_NBPAGE};
// select query
Cursor cursor = getDB().query(TABLE_NAME, allColumns, null, null, null, null, null);
// iterate on cursor and retreive result
List<Book> books = new ArrayList<Book>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
books.add(new Book(cursor.getInt(0), cursor.getString(1),
cursor.getString(2), cursor.getInt(3)));
cursor.moveToNext();
}
cursor.close();
return books;
}
Itération sur le recordset
session sept 2014 Yann Caron (c) 2014 58
Un peu de refactoring

Une classe abstraite
commune à tous les
POJO

Une interface pour les
datasources
public abstract class POJO {
protected int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public POJO(int id) {
this.id = id;
}
}public interface DataSource {
SQLiteDatabase getDB();
void open();
void close();
}
session sept 2014 Yann Caron (c) 2014 59
Un peu de refactoring

Une classe
abstraite pour tous
les DAO

Des interfaces
pour rajouter des
spécificités

Plus très loin d'un
ORM !
public abstract class DataAccessObject<P extends POJO> {
private final DataSource datasource;
public DataAccessObject(DataSource datasource) {
this.datasource = datasource;
}
public SQLiteDatabase getDB() {
return datasource.getDB();
}
// CRUD
public abstract P create(P POJO);
public abstract P read(P POJO);
public abstract P update(P POJO);
public abstract void delete(P POJO);
}
public interface AllReadeable<P extends POJO> {
List<P> readAll();
}
session sept 2014 Yann Caron (c) 2014 60
Avantages/Inconvénients

Avantages :
➔
Séparation des responsabilités
➔
Facile à maintenir ?

Inconvénients
➔
Pas vraiment typés (String[] args)
➔
Encore un peu de SQL par endroits (“id = ?”)
➔
Mapping fastidieux, beaucoup de code à maintenir
➔
BLOB (objet binaire) limité à 1Mb
session sept 2014 Yann Caron (c) 2014 61
IN01 – Séance 04
Object Relational Mapping
session sept 2014 Yann Caron (c) 2014 62
ORMLite

Object Relational Mapping

Basé sur des annotations (plus simple qu'Hibernate)
➔
Facile à mettre en oeuvre
➔
Lisible
➔
Contre : intrusif, ne peut pas être appliqué à un objet dont
on ne possède pas les sources

Téléchargement : http://ormlite.com/releases/

Libraries : ormlite-core et ormlite-android
session sept 2014 Yann Caron (c) 2014 63
POJO

À quoi ressemble notre
nouveau POJO ?

Quelques annotations
@DatabaseTable
 @DatabaseField

Un constructeur par
défaut obligatoire
public class Book extends POJO {
// fields
@DatabaseField(generatedId = true)
protected int id;
@DatabaseField(index = true)
private String title;
@DatabaseField()
private String isbn;
@DatabaseField
private int nbPage;
// etx ….
// accessor
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
Annotation
de mapping
session sept 2014 Yann Caron (c) 2014 64
@DatabaseTable

Assure la correspondance entre le POJO, la
table et le DAO

Des paramètres à l'annotation :
➔
tableName : spécifie le nom de la table (le nom de
la classe est utilisé par défaut)
➔
daoClass : le nom de la classe du DAO
session sept 2014 Yann Caron (c) 2014 65
@DatabaseField

Permet de spécifier quels attributs doivent être
persistés

Des paramètres à l'annotation :
➔
columnName : le nom du champ dans la base (le nom de
l'attribut est utilisé par défaut)
➔
index : si le champ est indexé
➔
generatedId : ID auto incrémental
➔
canBeNull, foreign, unique ….
session sept 2014 Yann Caron (c) 2014 66
Le DBHelper
public class LibraryDBHelper extends OrmLiteSqliteOpenHelper {
public static final String DB_NAME = "Library.db";
public static final int DB_VERSION = 4;
public LibraryDBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqld, ConnectionSource cs) {
try {
TableUtils.createTable(connectionSource, Book.class);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
@Override
public void onUpgrade(SQLiteDatabase sqld, ConnectionSource cs, int i, int i1) {
try {
TableUtils.dropTable(connectionSource, Book.class, true);
TableUtils.createTable(connectionSource, Book.class);
} catch (SQLException ex) {
throw new RuntimeException(ex);
}
}
}
Factory automatique,
lien sur la classe
session sept 2014 Yann Caron (c) 2014 67
OrmLiteSqliteOpenHelper

Doit hériter de la classe
OrmLiteSqliteOpenHelper

Même principe que pour SQLite, en charge de
créer ou d'upgrader le schéma de la base

Mais s'appuie sur les POJO pour la création
des tables : TableUtils.createTable

Et le drop : TableUtils.dropTable
session sept 2014 Yann Caron (c) 2014 68
Mise en œuvre
public class MainActivity extends OrmLiteBaseActivity<LibraryDBHelper> {
private void doSomeDBStuff() {
RuntimeExceptionDao<Book, Integer> bookDAO = getHelper().getDao(Book.class);
Book book1 = new Book(-1, "Croc Blanc", "2010034031", 248);
Book book2 = new Book(-1, "L'appel de la forêt", "2253039861", 158);
bookDAO.create(book1);
bookDAO.create(book2);
List<Book> books = bookDAO.queryForAll();
for (Book book : books) {
Log.w("READ ALL", book.toString());
}
Log.e("READ", bookDAO.queryForId(1).toString());
}
}
}
DAO factory
Itération sur la liste
de POJO
session sept 2014 Yann Caron (c) 2014 69
DAO

Un nouveau type d'activity
OrmLiteBaseActivity

Même principe qu'avec les DAO

Le DAO est récupéré auprès du helper
➔
Meilleure gestion des appels multithreads
➔
Utilise la méthode getDao(Class<T> clazz)
session sept 2014 Yann Caron (c) 2014 70
Méthodes du DAO

Les DAO ORMLite définissent plusieurs
méthodes :
➔
create (T data) : C
➔
queryForID (int id) : (R) requête sur l'identifiant
➔
queryForEq (String fieldName, Object value) : (R)
requête sur une valeur
➔
update (T data) : U
➔
delete (T data) : D
session sept 2014 Yann Caron (c) 2014 71
PreparedStmt

Requêtes plus complexes

Utilisation de requêtes préparées
PreparedStmt
<T>
PreparedDelete
<T>
PreparedQuery
<T>
PreparedUpdate
<T>
session sept 2014 Yann Caron (c) 2014 72
QueryBuilder

Les requêtes préparées sont construites à partir de
fabriques
➔
Classes QueryBuilder, UpdateBuilder, DeleteBuilder
➔
méthodes de configuration de la requête : where(),
orderBy(), and(), or() ….
➔
Une méthode prepare() permet de construire la requête
configurée

Enfin un design pattern Builder (GoF) pour construire les
requêtes
session sept 2014 Yann Caron (c) 2014 73
QueryBuilder
private void doOtherDBStuff() {
RuntimeExceptionDao<Book, Integer> bookDAO = getHelper().getBookDataDao();
QueryBuilder<Book, Integer> queryBuilder = bookDAO.queryBuilder();
Where<Book, Integer> where = queryBuilder.where();
where.and(
where.eq("title", "Croc Blanc"),
where.or(
where.eq("nbPage", 248),
where.eq("nbPage", 317)
)
);
List<Book> books = bookDAO.query(queryBuilder.prepare());
for (Book book : books) {
Log.w("READ BY QUERY", book.toString());
}
}
Builder
Prépare la requête
session sept 2014 Yann Caron (c) 2014 74
Avantages/inconvénients ?

Avantages :
➔
Séparation des responsabilités
➔
Moins de code que précédemment (les POJO et un
helper)
➔
Un builder pour créer les queries (plus de SQL)

Inconvénients
➔
Pas vraiment typés non plus (where.eq)
➔
Mapping Relationel/Objet = complexité supplémentaire
session sept 2014 Yann Caron (c) 2014 75
IN01 – Séance 04
NoSQL - OODBMS - DB4Object
session sept 2014 Yann Caron (c) 2014 76
DB4Object

Créé par Versant en 2000

Double licence : OpenSource GPL/Commerciale

Compatible Java et .net

Divers secteurs d'activités (Mobile, Navigation, SCADA, Devices and
equipments, Domotique)

Embarquable sur Android

NoSQL/OODBMS

Des outils de management (plugins Eclipse ou VisualStudio)

Réplication objet ou relationnelle
session sept 2014 Yann Caron (c) 2014 77
Réplication

Réplication
bidirectionnelle

Avec des SGBDR
via Hibernate
session sept 2014 Yann Caron (c) 2014 78
Performances

Réalisé par Versant, sur un graph complexe
d'objets et un héritage de 5 niveaux
session sept 2014 Yann Caron (c) 2014 79
Nos POJO

L'ID n'est plus
nécessaire :
relations basées sur
les pointeurs

Réduit à sa plus
simple expression
public class Book {
// attributes
private String title;
private String isbn;
private int nbPage;
// accessors
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
// etc.
// constructor ….
// toString ….
session sept 2014 Yann Caron (c) 2014 80
Mise en œuvre

user-permission WRITE_EXTERNAL_STORAGE
public static final String DB_FILE = root + "/db.db4o";
private void doSomeBookStuff(ObjectContainer db) {
Book book1 = new Book("Croc Blanc", "2010034031", 248);
Book book2 = new Book("L'appel de la forêt", "2253039861", 158);
db.store(book1);
db.store(book2);
ObjectSet<Book> result = db.queryByExample(Book.class);
for (Book p : result) {
textview.append("DB4O SELECT ALL Book " + p + " loaded !n");
}
}
}
Méthode store()
session sept 2014 Yann Caron (c) 2014 81
Mise en œuvre

La gestion du modèle devient inutile, DB4O se
charge de tout
➔
Ou presque : veiller à toujours utiliser les mêmes
noms de classe, sinon prévoir de configurer la
transition

Insert ou Update automatique
session sept 2014 Yann Caron (c) 2014 82
Héritage
private void doSomeHierarchicalStuff(ObjectContainer db) {
Department root = new Department("T");
Department td = new Department("D");
Department to = new Department("O");
root.addChild(td);
root.addChild(to);
db.store(root);
db.store(new Person("Johanna", "Caron", 26));
db.store(new Employe(td, "Yann", "Caron", 34));
ObjectSet<Person> result = db.queryByExample(Person.class);
for (Person p : result) {
textview.append("DB4O HIERARCHICAL Object " + p + " loaded !n");
}
}
session sept 2014 Yann Caron (c) 2014 83
Héritage

Un employé est une personne avec un
département rattaché

Les départements sont organisés de façon
hiérarchique (Design pattern composite)

Les relations sont établies sur les pointeurs
entre objets

Aucun mapping !
session sept 2014 Yann Caron (c) 2014 84
Mise en œuvre

La gestion du modèle devient inutile, DB4O se
charge de tout
➔
Ou presque : veiller à toujours utiliser les mêmes
noms de classe, sinon prévoir de configurer la
transition

Insert ou Update automatique
session sept 2014 Yann Caron (c) 2014 85
Requêtes

Trois façons d'effectuer des requêtes :
➔
QBE, Query By Example : le plus simple, on donne un objet
en exemple, et DB4O retourne tout ce qui y ressemble
➔
NQ, Native Query : ressemble à du fonctionnel
➔
SODA : Builder de bas niveau, base de construction des
deux précédentes

Vivement une implémentation pour le JDK8 (Map,
Filter, Reduce)
session sept 2014 Yann Caron (c) 2014 86
Query By Example

Principe : créer un objet vide

Ne renseigner que les champs qui sont l'objet
de la recherche
private void doQBEDBStuff(ObjectContainer db) {
ObjectSet<Book> result = db.queryByExample(new Book("Croc Blanc", null, 0));
for (Book p : result) {
textview.append("DB4O QBE Object " + p + " loaded !n");
}
}
session sept 2014 Yann Caron (c) 2014 87
Native Query

Predicat ! Jointure ?
private void doNQDBStuff(ObjectContainer db) {
ObjectSet<Book> result = db.query(new Predicate<Book>() {
@Override
public boolean match(Book book) {
return "Croc Blanc".equals(book.getTitle());
}
});
for (Book p : result) {
textview.append("DB4O NQ1 Object " + p + " loaded !n");
}
ObjectSet<Employe> result2 = db.query(new Predicate<Employe>() {
@Override
public boolean match(Employe person) {
textview.append("NQ2 PREDICATE departement = " + person.getDepartement().getName() + "n");
return "TD".equals(person.getDepartement().getName());
}
});
for (Employe e : result2) {
textview.append("DB4O NQ2 Object " + e + " loaded !n");
}
}
Un prédicat
session sept 2014 Yann Caron (c) 2014 88
SODA

Ressemble au QueryBuilder vu précédemment

Plus puissant que les deux précédentes
méthodes
private void doSODADBStuff(ObjectContainer db) {
Query query = db.query();
query.constrain(Book.class);
query.descend("title").constrain("Croc Blanc").equal();
ObjectSet<Book> result = query.execute();
for (Book p : result) {
textview.append("DB4O SODA Object " + p + " loaded !n");
}
}
session sept 2014 Yann Caron (c) 2014 89
Constat

Modèle complexe qui ne pose aucun problème de persistance

Le code est minimal

La mise à jour du modèle est automatique

La gestion create/update également

Types complexes (tout ce que l'on peut imaginer avec les objets)
➔
Composite
➔
Interpréter (faire persister des comportements à interpréter, des
formules de calculs par exemple)
➔
Réseaux (réseaux de neurones ?)
session sept 2014 Yann Caron (c) 2014 90
Et bien plus encore

De bonnes performances annoncées

Un “foot print” de 1MB sur le disque

Une synchronisation prévue avec les SGBDR

Couche réseau optionnelle
➔
Mode client/serveur
➔
Publish/Subscribe pour synchroniser les clients
session sept 2014 Yann Caron (c) 2014 91
Pour aller plus loin !

Intégration avec les lambdas de Java 8 ?

Qu'en est-il des bases de données NoSQL de
type document :
➔
JasDB
➔
CouchDB CouchBaseLite (plus complexe de→
mise en œuvre que db4o)
➔
SnappyDB : Clé/Valeurs, c'est tout !?!?
session sept 2014 Yann Caron (c) 2014 92
Bibliographie

SQLite : http://www.sqlite.org/

SQLite sur Developpez.com :
http://a-renouard.developpez.com/tutoriels/and
roid/sqlite/

SQLite-Sync : http://sqlite-sync.com/

db4objects : http://www.db4o.com/
session sept 2014 Yann Caron (c) 2014 93
Sources de la présentation

Trouvez toutes les sources de la présentation
sur Bitbucket
https://bitbucket.org/yann_caron/in01/src/
session sept 2014 Yann Caron (c) 2014 94
Fin
 Merci de votre attention
 Des questions ?

Weitere ähnliche Inhalte

Was ist angesagt?

Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - AndroidYann Caron
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - DatabasesYann Caron
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - PrésentationYann Caron
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google mapYann Caron
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web servicesYann Caron
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesYann Caron
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidYann Caron
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesYann Caron
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteYann Caron
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionYann Caron
 

Was ist angesagt? (10)

Programmation Android - 02 - Android
Programmation Android - 02 - AndroidProgrammation Android - 02 - Android
Programmation Android - 02 - Android
 
Programmation Android - 04 - Databases
Programmation Android - 04 - DatabasesProgrammation Android - 04 - Databases
Programmation Android - 04 - Databases
 
Programmation Android - 00 - Présentation
Programmation Android - 00 - PrésentationProgrammation Android - 00 - Présentation
Programmation Android - 00 - Présentation
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web services
 
Programmation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancéesProgrammation Android 07 - Techniques avancées
Programmation Android 07 - Techniques avancées
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM bases
 
Programmation Android - 10 - Spatialite
Programmation Android - 10 - SpatialiteProgrammation Android - 10 - Spatialite
Programmation Android - 10 - Spatialite
 
In01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introductionIn01 - Programmation Android - 01 - introduction
In01 - Programmation Android - 01 - introduction
 

Andere mochten auch

Développement Android
Développement AndroidDéveloppement Android
Développement AndroidFranck SIMON
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Android et Interaction avec le réseau
Android et Interaction avec le réseauAndroid et Interaction avec le réseau
Android et Interaction avec le réseauyounes ben tlili
 
Présentation et Initiative pour le développement Android
Présentation et Initiative pour le développement AndroidPrésentation et Initiative pour le développement Android
Présentation et Initiative pour le développement Androidyounes ben tlili
 
Analyse des Données - Une Approche Innovante pour le Secteur Financier
Analyse des Données - Une Approche Innovante pour le Secteur FinancierAnalyse des Données - Une Approche Innovante pour le Secteur Financier
Analyse des Données - Une Approche Innovante pour le Secteur FinancierTrick Consulting
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux ServletsFrançois Charoy
 
Ecoscan guide fr
Ecoscan guide frEcoscan guide fr
Ecoscan guide frGroupe One
 
Coordination of Activities in Dynamic Situations – The Case Of Crisis Management
Coordination of Activities in Dynamic Situations – The Case Of Crisis ManagementCoordination of Activities in Dynamic Situations – The Case Of Crisis Management
Coordination of Activities in Dynamic Situations – The Case Of Crisis ManagementFrançois Charoy
 
Méthodes scientifiques cours 1 : presentation
Méthodes scientifiques cours 1 : presentationMéthodes scientifiques cours 1 : presentation
Méthodes scientifiques cours 1 : presentationJulien Physagreg
 
Les outils technologiques au service de l'accueil sur le territoire : le proj...
Les outils technologiques au service de l'accueil sur le territoire : le proj...Les outils technologiques au service de l'accueil sur le territoire : le proj...
Les outils technologiques au service de l'accueil sur le territoire : le proj...UETR2011Bergerac
 

Andere mochten auch (20)

Programmation sous Android
Programmation sous AndroidProgrammation sous Android
Programmation sous Android
 
Développement Android
Développement AndroidDéveloppement Android
Développement Android
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Android et Interaction avec le réseau
Android et Interaction avec le réseauAndroid et Interaction avec le réseau
Android et Interaction avec le réseau
 
Présentation et Initiative pour le développement Android
Présentation et Initiative pour le développement AndroidPrésentation et Initiative pour le développement Android
Présentation et Initiative pour le développement Android
 
Analyse des Données - Une Approche Innovante pour le Secteur Financier
Analyse des Données - Une Approche Innovante pour le Secteur FinancierAnalyse des Données - Une Approche Innovante pour le Secteur Financier
Analyse des Données - Une Approche Innovante pour le Secteur Financier
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Introductions Aux Servlets
Introductions Aux ServletsIntroductions Aux Servlets
Introductions Aux Servlets
 
Pilote5
Pilote5Pilote5
Pilote5
 
Ecoscan guide fr
Ecoscan guide frEcoscan guide fr
Ecoscan guide fr
 
Coordination of Activities in Dynamic Situations – The Case Of Crisis Management
Coordination of Activities in Dynamic Situations – The Case Of Crisis ManagementCoordination of Activities in Dynamic Situations – The Case Of Crisis Management
Coordination of Activities in Dynamic Situations – The Case Of Crisis Management
 
Chapitre 03 : Structures de contrôle
Chapitre 03 : Structures de contrôleChapitre 03 : Structures de contrôle
Chapitre 03 : Structures de contrôle
 
Méthodes scientifiques cours 1 : presentation
Méthodes scientifiques cours 1 : presentationMéthodes scientifiques cours 1 : presentation
Méthodes scientifiques cours 1 : presentation
 
Les outils technologiques au service de l'accueil sur le territoire : le proj...
Les outils technologiques au service de l'accueil sur le territoire : le proj...Les outils technologiques au service de l'accueil sur le territoire : le proj...
Les outils technologiques au service de l'accueil sur le territoire : le proj...
 
Chapitre 02 : Variables, Expressions et Instructions
Chapitre 02 : Variables, Expressions et InstructionsChapitre 02 : Variables, Expressions et Instructions
Chapitre 02 : Variables, Expressions et Instructions
 

Ähnlich wie In01 - Programmation Android - 04 - databases

Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Luc Desruelle
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity frameworkDNG Consulting
 
SQLSaturday Paris 2014 - Et hop, ma base migre dans Azure
SQLSaturday Paris 2014 - Et hop, ma base migre dans AzureSQLSaturday Paris 2014 - Et hop, ma base migre dans Azure
SQLSaturday Paris 2014 - Et hop, ma base migre dans AzureGUSS
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
Sql saturday 323 paris 2014 azure migration iaas et paas
Sql saturday 323 paris 2014   azure migration iaas et paasSql saturday 323 paris 2014   azure migration iaas et paas
Sql saturday 323 paris 2014 azure migration iaas et paasChristophe Laporte
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) univalence
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven DesignDNG Consulting
 
Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]linasafaa
 
Bases de Données non relationnelles, NoSQL (Introduction) 1er cours
Bases de Données non relationnelles, NoSQL (Introduction) 1er coursBases de Données non relationnelles, NoSQL (Introduction) 1er cours
Bases de Données non relationnelles, NoSQL (Introduction) 1er coursHatim CHAHDI
 
Présentation des bases de données orientées graphes
Présentation des bases de données orientées graphesPrésentation des bases de données orientées graphes
Présentation des bases de données orientées graphesKoffi Sani
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLHervé Leclerc
 
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...RainerZaiss
 
introduction à la gestion de projet
introduction à la gestion de projetintroduction à la gestion de projet
introduction à la gestion de projetlaureno
 
Découverte du SPARQL endpoint de HAL
Découverte du SPARQL endpoint de HALDécouverte du SPARQL endpoint de HAL
Découverte du SPARQL endpoint de HALGautier Poupeau
 

Ähnlich wie In01 - Programmation Android - 04 - databases (20)

Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
 
Linq et Entity framework
Linq et Entity frameworkLinq et Entity framework
Linq et Entity framework
 
SQLSaturday Paris 2014 - Et hop, ma base migre dans Azure
SQLSaturday Paris 2014 - Et hop, ma base migre dans AzureSQLSaturday Paris 2014 - Et hop, ma base migre dans Azure
SQLSaturday Paris 2014 - Et hop, ma base migre dans Azure
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
Sql saturday 323 paris 2014 azure migration iaas et paas
Sql saturday 323 paris 2014   azure migration iaas et paasSql saturday 323 paris 2014   azure migration iaas et paas
Sql saturday 323 paris 2014 azure migration iaas et paas
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
 
cm-bd.pdf
cm-bd.pdfcm-bd.pdf
cm-bd.pdf
 
Mongo db with C#
Mongo db with C#Mongo db with C#
Mongo db with C#
 
Mongo DB
Mongo DBMongo DB
Mongo DB
 
Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]Mappingobjetrelationnel[1]
Mappingobjetrelationnel[1]
 
Bases de Données non relationnelles, NoSQL (Introduction) 1er cours
Bases de Données non relationnelles, NoSQL (Introduction) 1er coursBases de Données non relationnelles, NoSQL (Introduction) 1er cours
Bases de Données non relationnelles, NoSQL (Introduction) 1er cours
 
Présentation des bases de données orientées graphes
Présentation des bases de données orientées graphesPrésentation des bases de données orientées graphes
Présentation des bases de données orientées graphes
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
Tutorial
TutorialTutorial
Tutorial
 
SSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQLSSL 2011 : Présentation de 2 bases noSQL
SSL 2011 : Présentation de 2 bases noSQL
 
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
SPECIFY - un nouveau système de gestion pour l’Herbier de Nouvelle-Calédonie ...
 
introduction à la gestion de projet
introduction à la gestion de projetintroduction à la gestion de projet
introduction à la gestion de projet
 
Découverte du SPARQL endpoint de HAL
Découverte du SPARQL endpoint de HALDécouverte du SPARQL endpoint de HAL
Découverte du SPARQL endpoint de HAL
 

Mehr von Yann Caron

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownTextYann Caron
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesYann Caron
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesYann Caron
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genYann Caron
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresYann Caron
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationYann Caron
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionYann Caron
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusionYann Caron
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemisYann Caron
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmesYann Caron
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - heroYann Caron
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introductionYann Caron
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeYann Caron
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Yann Caron
 

Mehr von Yann Caron (14)

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
 

In01 - Programmation Android - 04 - databases

  • 1. session sept 2014 Yann Caron (c) 2014 1 IN01 Programmation Android 04 – Bases de données Yann Caron
  • 2. session sept 2014 Yann Caron (c) 2014 2 Sommaire - Séance 04  Rappel sur les SGBD  Couches logiciels  SQLite  Object Relational Mapping  NoSQL - OODBMS - DB4Object
  • 3. session sept 2014 Yann Caron (c) 2014 3 IN01 – Séance 04 Rappel sur les SGBD
  • 4. session sept 2014 Yann Caron (c) 2014 4 Les bases de données  Wiki : une base de données est un magasin de données composé de plusieurs fichiers manipulés exclusivement par le SGBD  Ce dernier cache la complexité de manipulation des structures de la base de données en mettant à disposition une vue synthétique du contenu  Les SGBD sont les logiciels intermédiaires entre les utilisateurs et les bases de données
  • 5. session sept 2014 Yann Caron (c) 2014 5 Exigences d'un SGBD  Stocker des données, les modifier  Un processus d'interrogation et de recherche des données selon un ou plusieurs critères  Pouvoir créer des sauvegardes et les restaurer si besoin  Application de règles pour assurer la cohérence des données (selon les relations entre elles)  Sécurité : un processus d'authentification pour protéger les données
  • 6. session sept 2014 Yann Caron (c) 2014 6 Exigences d'un SGBD  Abstraire la couche de stockage et les processus de requêtage  Logging : track les modifications effectuées par les utilisateurs  Optimisation : performance tuning
  • 7. session sept 2014 Yann Caron (c) 2014 7 ACID  Lors d'une manipulation des données, il faut toujours s'assurer que la base de données conserve son intégrité  Une transaction (modification bornée) doit être : ➔ Atomique : la suite des opérations est indivisible (synchronized) ➔ Cohérente : le contenu FINAL doit être cohérent, même si les étapes intermédiaires ne le sont pas ➔ Isolée : pas d'interaction entre des transactions concurrentes ➔ Durable : une fois validé, l'état devient permanent et aucun incident technique ne doit altérer le résultat d'une transaction
  • 8. session sept 2014 Yann Caron (c) 2014 8 CRUD  Opérations de base dans un SGBD  Create, Read, Update, Delete Operation SQL HTTP DB4O Create INSERT POST .store Read (Retrieve) SELECT GET .queryByExample .AsQueryable Update UPDATE PUT / PATCH .store Delete DELETE DELETE .delete
  • 9. session sept 2014 Yann Caron (c) 2014 9 SGBDR  Système de gestion de bases de données relationnelles  Relations : ➔ One to one ➔ One to many ➔ Many to many  Normalisation
  • 10. session sept 2014 Yann Caron (c) 2014 10 Bibliothèque Book title : nvarchar isbn : nvarchar nbPage : int Book title isbn nbPage Croc blanc 2010034031 248 Vingt mille lieues sous les mers 353
  • 11. session sept 2014 Yann Caron (c) 2014 11 Bibliothèque MCD Book Genre Author Customer belongs to written by borrown n 1 n 1 n
  • 12. session sept 2014 Yann Caron (c) 2014 12 Bibliothèque MLD Book Genre Author Customer n n 1 n 1 n borrow 11 fromDate toDate
  • 13. session sept 2014 Yann Caron (c) 2014 13 Queries  Tous les livres dont le nom commence par la lettre “a” ➔ SELECT * FROM Book WHERE name LIKE 'A %'  Tous les livres du même auteur ➔ SELECT * FROM Book b INNER JOIN Author a ON b.idAuthor = a.id WHERE a.name = 'Jack London'
  • 14. session sept 2014 Yann Caron (c) 2014 14 Ensembles  Sous-ensembles résultant de la jointure A 1 2 3 4 B 3 4 7 8 FULL JOIN A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8 =
  • 15. session sept 2014 Yann Caron (c) 2014 15 Ensembles Inner Join SELECT * FROM A INNER JOIN B ON A.key = B.key Full Join SELECT * FROM A FULL JOIN B ON A.key = B.key A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8 A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8
  • 16. session sept 2014 Yann Caron (c) 2014 16 Ensembles Full Join Sans intersection SELECT * FROM A FULL JOIN B ON A.key = B.key WHERE A.key IS NULL OR B.key IS NULL A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8
  • 17. session sept 2014 Yann Caron (c) 2014 17 Ensembles Left Left Join SELECT * FROM A LEFT JOIN B ON A.key = B.key Left Join sans intersection SELECT * FROM A LEFT JOIN B ON A.key = B.key WHERE B.key IS NULL A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8 A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8
  • 18. session sept 2014 Yann Caron (c) 2014 18 Ensembles Right Right Join SELECT * FROM A RIGHT JOIN B ON A.key = B.key Right Join sans intersection SELECT * FROM A RIGHT JOIN B ON A.key = B.key WHERE A.key IS NULL A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8 A B 1 NULL 2 NULL 3 3 4 4 NULL 7 NULL 8
  • 19. session sept 2014 Yann Caron (c) 2014 19 Ensembles  Ne pas confondre avec le produit cartésien  Le résultat est l'ensemble de tous les couples (distribution) SELECT * FROM A CROSS JOIN B
  • 20. session sept 2014 Yann Caron (c) 2014 20 CRUD - SQL98  Create : ➔ INSERT INTO Books (title, isbn, nbPage) VALUES (“Croc blanc”, “2010034031”, 248)  Read : ➔ SELECT * FROM Books WHERE title = “Croc blanc”  Update : ➔ UPDATE Books SET nbPage = 248 WHERE title = “Croc blanc”  Delete : ➔ DELETE FROM Books WHERE title = “Croc blanc”
  • 21. session sept 2014 Yann Caron (c) 2014 21 IN01 – Séance 04 Couches logiciels
  • 22. session sept 2014 Yann Caron (c) 2014 22 Patron - Layer  POSA : Pattern Oriented Software Architecture  Architecturer les applications en couches  Chaque couche a son niveau d'abstraction propre  Séparation des responsabilités par niveau d'abstraction  Rend interchangeables les différentes couches  exemple : couches OSI (réseau)
  • 23. session sept 2014 Yann Caron (c) 2014 23 Patron – Layer – Exemple Data Access Layer Data Transfert Objects Logger Business Model View FishDb4o FishDAO (CRUD) FamilyDb4o FamilyDAO (CRUD) db4o FishBO FamilyBO FishView FamilyView Fish Familly 1..1 Fish
  • 24. session sept 2014 Yann Caron (c) 2014 24 Patron - Layer  La couche L  Elle offre un service à la couche supérieure (L+1)  Elle délègue les sous-tâches à la couche inférieure (L–1)  Elle ne collabore qu'avec la couche inférieure (L-1)
  • 25. session sept 2014 Yann Caron (c) 2014 25 Patron - Layer  Communications descendantes directes (création d'objets, appel de méthodes) ➔ White boxe, les objets sont accessibles ➔ Black boxe, les objets sont utilisés au travers d'un adapter et/ou des interfaces  Communications ascendantes découplées (callback, observer/observable, template method – choix pour Algoid)
  • 26. session sept 2014 Yann Caron (c) 2014 26 DTO – Data Transfert Object  Ensemble de POJO (Plain Old Java Object) représente le modèle business  Pour chaque table de la DB = 1 POJO (bean)  Un bean mutable (attributs privés, getters, setters, constructeur par défaut – state less, constructeur avec assignation des attributs – state full…)
  • 27. session sept 2014 Yann Caron (c) 2014 27 Un design pattern : DAO  Data Access Object  Une interface CRUD : avec les méthodes de création, lecture, modification et suppression  Permet une séparation des responsabilités entre les objets métier et l'accès à la base de données  1 table = 1 DAO = 1 DTO (bean)
  • 28. session sept 2014 Yann Caron (c) 2014 28 Un design pattern : DAO Objets métier SGBDDAO Data access abstraction POJO Interface DAO DAO interface DAO interface create () selectAll () select () update () delete () Tables Factory
  • 29. session sept 2014 Yann Caron (c) 2014 29 ORM  Object Relational Mapping  Un framework qui le fait pour nous  Transforme les objets en tables et vice versa, les attributs en champs.  Correspondance des types (Java/SQLite)  Plusieurs modes de configuration : XML, paramétrisation, annotations  Un grand nombre d'ORM sur le marché : Hibernate, OJB, SimpleORM, ORMLite, Nhibernate, Entity Framework, Linq To SQL  Une problématique répandue
  • 30. session sept 2014 Yann Caron (c) 2014 30 Autres possibilités  Systèmes NoSQL (Not Only SQL)  Document-oriented database system ➔ Basé sur des standards de description de documents : XML, YAML, JSON (JavaScript Object Notation), BSON (Binary JSON) ➔ Informix, MongoDB, OrientDB, Cassandra  Graphs-oriented database system  OODBMS ➔ Object oriented database management system ➔ DB4O, une base de données embarquable sur Android
  • 31. session sept 2014 Yann Caron (c) 2014 31 Différentes approches de la persistance
  • 32. session sept 2014 Yann Caron (c) 2014 32 SGBDOO - Avantages  Bénéficie de la puissance et de la flexibilité de l'objet (avec les objets, on peut tout représenter)  Pas de mapping  Relation n/n (many to many) native  Héritage  Patron Composite  Découplage des complexités
  • 33. session sept 2014 Yann Caron (c) 2014 33 Inconvénients  Limites des SGBDOO : ➔ Méconnues ➔ Manque de standardisation malgré l’ODMG (accès multiples) ➔ Peu d'interopérabilité avec les BDR et les outils (OLAP, reporting) ➔ Toutes n’implémentent pas encore le backup incrémental ➔ Coût de migration élevé  Limitations peu importantes pour une DB embarquée sur Android, n'est-ce pas ?
  • 34. session sept 2014 Yann Caron (c) 2014 34 IN01 – Séance 04 SQLite
  • 35. session sept 2014 Yann Caron (c) 2014 35 SQLite  Moteur de base de données relationnelle  Crée par D.Richard Hipp  Écrit en C (ANSI-C)  Open source sans restriction  Multiplate-forme  Le plus distribué au monde (Firefox, Skype, Google Gears)  Systèmes embarqués (iPhone, Symbian, Android, mais pas sur Windows Phone)
  • 36. session sept 2014 Yann Caron (c) 2014 36 SQLite  Implémente le standard SQL-92 (alias SQL2)  Et les propriétés ACID  SGBD embarqué  Pas de gestion des droits (mono-utilisateur)  Pas de configuration
  • 37. session sept 2014 Yann Caron (c) 2014 37 Embarqué  Fichiers simples, Modèle embarqué, Modèle client-serveur (n-tiers) Espace application Application SQLite Données Espace application Application Données Espace application Application Client Données SGBD
  • 38. session sept 2014 Yann Caron (c) 2014 38 Patron – Layer – Exemple Data Access Layer Data Transfert Objects Logger Business Model View FishDb4o FishDAO (CRUD) FamilyDb4o FamilyDAO (CRUD) db4o FishBO FamilyBO FishView FamilyView Fish Familly 1..1
  • 39. session sept 2014 Yann Caron (c) 2014 39 Mais…  Dépendant du système de fichier  une base de données = un fichier  Attention à la limite sur des DD formatés en FAT 32  Pas d'extension propre, (“.sqlite”, “.db” sont de bonnes pratiques)  Possibilité de sauvegarde en mémoire vive (extension “:memory:”)  Objectif : remplacer le système de fichiers, mais pas les SGBDR
  • 40. session sept 2014 Yann Caron (c) 2014 40 Compilation Architecture  Virtual Machine ?  OpCode (137 instructions)  Arbre-B ?  Abstraction matérielle Interface (API) Lexer Machine virtuelle Parser CodeGen (opCode) Ressources(Android) Abstraction matérielle Cacher Gestionnaire B-Tree
  • 41. session sept 2014 Yann Caron (c) 2014 41 Notre bibliothèque avec SQLite  Le POJO Book  Un objet qui représente un record “livre”  Des attributs, des accesseurs, un constructeur stateless et un statefull public class Book { // attributes private int id; private String title; private String isbn; private int nbPage; // accessors public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } // etc. // constructor public Book(int id) { super(id); } public Book(int id, String title, String isbn, int nbPage) { this(id); this.title = title; this.isbn = isbn; this.nbPage = nbPage; } }
  • 42. session sept 2014 Yann Caron (c) 2014 42 Création de la base  Il faut fournir une classe qui a pour responsabilité la création de la base et la mise à jour du schéma public class LibraryDBHelper extends SQLiteOpenHelper { @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } }
  • 43. session sept 2014 Yann Caron (c) 2014 43 Création de la base  Une classe abstraite : SQLiteOpenHelper  Design pattern : Template method (GoF)  Un constructeur : données utiles  Deux méthodes abstraites : ➔ onCreate : chargée de la création de la DB ➔ onUpgrade : chargée de la mise à jour du schéma (en général, on efface tout et on recommence)
  • 44. session sept 2014 Yann Caron (c) 2014 44 Constructeur  Le context Android  Le nom du fichier  Le créateur de curseur (null par défaut)  La version  Un handler en cas de corruption de la base (par défaut) public static final String DB_NAME = "Library.db"; public static final int DB_VERSION = 5; // constructor public LibraryDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); }
  • 45. session sept 2014 Yann Caron (c) 2014 45 Création et Upgrade public class LibraryDBHelper extends SQLiteOpenHelper { public static final String DB_NAME = "Library.db"; public static final int DB_VERSION = 5; public static String getQueryCreate() { return "CREATE TABLE Book (" + "id Integer PRIMARY KEY AUTOINCREMENT, " + "title Text NOT NULL, " + "isbn Text NOT NULL, " + "nbPage Integer NOT NULL" + ");"; } public static String getQueryDrop() { return "DROP TABLE IF EXISTS Book;"; } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(getQueryCreate()); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(getQueryDrop()); db.execSQL(getQueryCreate()); } } Crée les tables Recrée les tables
  • 46. session sept 2014 Yann Caron (c) 2014 46 Gestion plus fine de l'upgrade  Des petits pas jusqu'à la version courante @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Management by successive upgrades // newVersion is 4 ! int delta = newVersion - oldVersion; if (delta >= 3) { // upgrate to version 2 } if (delta >= 2) { // upgrate to version 3 } if (delta >= 1) { // upgrate to version 4 } } Gère les changements étape par étape
  • 47. session sept 2014 Yann Caron (c) 2014 47 Datasource  Une classe responsable de l'accès à la base de données  Responsable de créer le helper  Ouvrir (open())/Fermer (close())/Donner accès aux données (getDB())  Factory des différents DAO
  • 48. session sept 2014 Yann Caron (c) 2014 48 Datasource  Crée le helper  Accès à la db  Ouvre et ferme la connexion  Les factories public class LibraryDataSource { private final LibraryDBHelper helper; private SQLiteDatabase db; public LibraryDataSource(Context context) { helper = new LibraryDBHelper(context); } public SQLiteDatabase getDB() { if (db == null) open(); // lazy initialization return db; } public void open() throws SQLException { db = helper.getWritableDatabase(); } public void close() { helper.close(); } // factories public BookDAO newBookDAO() { return new BookDAO(this); // flyweight ? } } Accès à la base DAO factories
  • 49. session sept 2014 Yann Caron (c) 2014 49 DAO et CRUD  Référence la datasource  Create() : crée le record à partir du POJO, gestion de son nouvel ID  Read() : lit le record selon l'ID et charge ses champs avec les valeurs de la DB  Update() : met à jour les valeurs de la base à partir du POJO  Delete() : supprime le record selon l'ID du POJO
  • 50. session sept 2014 Yann Caron (c) 2014 50 Écrire la donnée  Une classe android.content.ContentValues  Tableau associatif (Set) ➔ Clé : nom du champ en base ➔ Valeur : valeur de la donnée dans le POJO  Une méthode put(String key, ???? value) pour créer l'association (overload sur chaque type)  Des méthodes pour récupérer les valeurs selon les clés (getAsInteger(), getAsDouble()…)
  • 51. session sept 2014 Yann Caron (c) 2014 51 Méthode create() du DAO  Crée le tableau associatif avec les valeurs du POJO  Exécute la requête d'insertion  Met à jour l'ID  Retourne le POJO mis à jour Public synchronized Book create(Book POJO) { // create associative array ContentValues values = new ContentValues(); values.put(COL_TITLE, POJO.getTitle()); values.put(COL_ISBN, POJO.getIsbn()); values.put(COL_NBPAGE, POJO.getNbPage()); // insert query int id = (int) getDB().insert(TABLE_NAME, null, values); // update id into POJO POJO.setId(id); return POJO; } Tableau associatif API level
  • 52. session sept 2014 Yann Caron (c) 2014 52 Méthode update() du DAO  Le même principe que l'insert  La clause en plus Public synchronized Book update(Book POJO) { // create associative array ContentValues values = new ContentValues(); values.put(COL_TITLE, POJO.getTitle()); values.put(COL_ISBN, POJO.getIsbn()); values.put(COL_NBPAGE, POJO.getNbPage()); // where clause String clause = COL_ID + " = ?"; String[] clauseArgs = new String[]{String.valueOf(POJO.getId())}; // update getDB().update(TABLE_NAME, values, clause, clauseArgs); // return the POJO return POJO; } Expression de recherche
  • 53. session sept 2014 Yann Caron (c) 2014 53 Méthode delete() du DAO  Que la clause where, cette fois-ci ! Public synchronized void delete(Book POJO) { // where clause String clause = COL_ID + " = ?"; String[] clauseArgs = new String[]{String.valueOf(POJO.getId())}; // delete getDB().delete(TABLE_NAME, clause, clauseArgs); }
  • 54. session sept 2014 Yann Caron (c) 2014 54 Lire la donnée  Deux méthodes : ➔ rawQuery (String query, String[] args)  Remplace les caractères “?” par les valeurs passées en argument  ex. : rawQuery(“SELECT * FROM book WHERE id = ?”, 1); ➔ query (String tableName, String[] columns, String clause, String[] args, String groupBy, String having, String orderBy) ➔ Idée, le moins de SQL possible dans le code  Pourquoi pas un design pattern de Builder ou Interpreter ?
  • 55. session sept 2014 Yann Caron (c) 2014 55 Cursor  La classe android.database.Cursor  Un design pattern Iterator  Sur une collection d'éléments typés (mais pas nommés)
  • 56. session sept 2014 Yann Caron (c) 2014 56 Méthode read() du DAO public Book read(Book POJO) { // columns String[] allColumns = new String[]{COL_ID, COL_TITLE, COL_ISBN, COL_NBPAGE}; // clause String clause = COL_ID + " = ?"; String[] clauseArgs = new String[]{String.valueOf(POJO.getId())}; // select query Cursor cursor = getDB().query(TABLE_NAME, allColumns, "ID = ?", clauseArgs, null, null, null); // read cursor cursor.moveToFirst(); POJO.setTitle(cursor.getString(1)); POJO.setIsbn(cursor.getString(2)); POJO.setNbPage(cursor.getInt(3)); cursor.close(); return POJO; } Expression de recherche Requête Chargement du POJO
  • 57. session sept 2014 Yann Caron (c) 2014 57 Méthode readAll() du DAO public List<Book> readAll() { // columns String[] allColumns = new String[]{COL_ID, COL_TITLE, COL_ISBN, COL_NBPAGE}; // select query Cursor cursor = getDB().query(TABLE_NAME, allColumns, null, null, null, null, null); // iterate on cursor and retreive result List<Book> books = new ArrayList<Book>(); cursor.moveToFirst(); while (!cursor.isAfterLast()) { books.add(new Book(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getInt(3))); cursor.moveToNext(); } cursor.close(); return books; } Itération sur le recordset
  • 58. session sept 2014 Yann Caron (c) 2014 58 Un peu de refactoring  Une classe abstraite commune à tous les POJO  Une interface pour les datasources public abstract class POJO { protected int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public POJO(int id) { this.id = id; } }public interface DataSource { SQLiteDatabase getDB(); void open(); void close(); }
  • 59. session sept 2014 Yann Caron (c) 2014 59 Un peu de refactoring  Une classe abstraite pour tous les DAO  Des interfaces pour rajouter des spécificités  Plus très loin d'un ORM ! public abstract class DataAccessObject<P extends POJO> { private final DataSource datasource; public DataAccessObject(DataSource datasource) { this.datasource = datasource; } public SQLiteDatabase getDB() { return datasource.getDB(); } // CRUD public abstract P create(P POJO); public abstract P read(P POJO); public abstract P update(P POJO); public abstract void delete(P POJO); } public interface AllReadeable<P extends POJO> { List<P> readAll(); }
  • 60. session sept 2014 Yann Caron (c) 2014 60 Avantages/Inconvénients  Avantages : ➔ Séparation des responsabilités ➔ Facile à maintenir ?  Inconvénients ➔ Pas vraiment typés (String[] args) ➔ Encore un peu de SQL par endroits (“id = ?”) ➔ Mapping fastidieux, beaucoup de code à maintenir ➔ BLOB (objet binaire) limité à 1Mb
  • 61. session sept 2014 Yann Caron (c) 2014 61 IN01 – Séance 04 Object Relational Mapping
  • 62. session sept 2014 Yann Caron (c) 2014 62 ORMLite  Object Relational Mapping  Basé sur des annotations (plus simple qu'Hibernate) ➔ Facile à mettre en oeuvre ➔ Lisible ➔ Contre : intrusif, ne peut pas être appliqué à un objet dont on ne possède pas les sources  Téléchargement : http://ormlite.com/releases/  Libraries : ormlite-core et ormlite-android
  • 63. session sept 2014 Yann Caron (c) 2014 63 POJO  À quoi ressemble notre nouveau POJO ?  Quelques annotations @DatabaseTable  @DatabaseField  Un constructeur par défaut obligatoire public class Book extends POJO { // fields @DatabaseField(generatedId = true) protected int id; @DatabaseField(index = true) private String title; @DatabaseField() private String isbn; @DatabaseField private int nbPage; // etx …. // accessor public int getId() { return id; } public void setId(int id) { this.id = id; } } Annotation de mapping
  • 64. session sept 2014 Yann Caron (c) 2014 64 @DatabaseTable  Assure la correspondance entre le POJO, la table et le DAO  Des paramètres à l'annotation : ➔ tableName : spécifie le nom de la table (le nom de la classe est utilisé par défaut) ➔ daoClass : le nom de la classe du DAO
  • 65. session sept 2014 Yann Caron (c) 2014 65 @DatabaseField  Permet de spécifier quels attributs doivent être persistés  Des paramètres à l'annotation : ➔ columnName : le nom du champ dans la base (le nom de l'attribut est utilisé par défaut) ➔ index : si le champ est indexé ➔ generatedId : ID auto incrémental ➔ canBeNull, foreign, unique ….
  • 66. session sept 2014 Yann Caron (c) 2014 66 Le DBHelper public class LibraryDBHelper extends OrmLiteSqliteOpenHelper { public static final String DB_NAME = "Library.db"; public static final int DB_VERSION = 4; public LibraryDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase sqld, ConnectionSource cs) { try { TableUtils.createTable(connectionSource, Book.class); } catch (SQLException ex) { throw new RuntimeException(ex); } } @Override public void onUpgrade(SQLiteDatabase sqld, ConnectionSource cs, int i, int i1) { try { TableUtils.dropTable(connectionSource, Book.class, true); TableUtils.createTable(connectionSource, Book.class); } catch (SQLException ex) { throw new RuntimeException(ex); } } } Factory automatique, lien sur la classe
  • 67. session sept 2014 Yann Caron (c) 2014 67 OrmLiteSqliteOpenHelper  Doit hériter de la classe OrmLiteSqliteOpenHelper  Même principe que pour SQLite, en charge de créer ou d'upgrader le schéma de la base  Mais s'appuie sur les POJO pour la création des tables : TableUtils.createTable  Et le drop : TableUtils.dropTable
  • 68. session sept 2014 Yann Caron (c) 2014 68 Mise en œuvre public class MainActivity extends OrmLiteBaseActivity<LibraryDBHelper> { private void doSomeDBStuff() { RuntimeExceptionDao<Book, Integer> bookDAO = getHelper().getDao(Book.class); Book book1 = new Book(-1, "Croc Blanc", "2010034031", 248); Book book2 = new Book(-1, "L'appel de la forêt", "2253039861", 158); bookDAO.create(book1); bookDAO.create(book2); List<Book> books = bookDAO.queryForAll(); for (Book book : books) { Log.w("READ ALL", book.toString()); } Log.e("READ", bookDAO.queryForId(1).toString()); } } } DAO factory Itération sur la liste de POJO
  • 69. session sept 2014 Yann Caron (c) 2014 69 DAO  Un nouveau type d'activity OrmLiteBaseActivity  Même principe qu'avec les DAO  Le DAO est récupéré auprès du helper ➔ Meilleure gestion des appels multithreads ➔ Utilise la méthode getDao(Class<T> clazz)
  • 70. session sept 2014 Yann Caron (c) 2014 70 Méthodes du DAO  Les DAO ORMLite définissent plusieurs méthodes : ➔ create (T data) : C ➔ queryForID (int id) : (R) requête sur l'identifiant ➔ queryForEq (String fieldName, Object value) : (R) requête sur une valeur ➔ update (T data) : U ➔ delete (T data) : D
  • 71. session sept 2014 Yann Caron (c) 2014 71 PreparedStmt  Requêtes plus complexes  Utilisation de requêtes préparées PreparedStmt <T> PreparedDelete <T> PreparedQuery <T> PreparedUpdate <T>
  • 72. session sept 2014 Yann Caron (c) 2014 72 QueryBuilder  Les requêtes préparées sont construites à partir de fabriques ➔ Classes QueryBuilder, UpdateBuilder, DeleteBuilder ➔ méthodes de configuration de la requête : where(), orderBy(), and(), or() …. ➔ Une méthode prepare() permet de construire la requête configurée  Enfin un design pattern Builder (GoF) pour construire les requêtes
  • 73. session sept 2014 Yann Caron (c) 2014 73 QueryBuilder private void doOtherDBStuff() { RuntimeExceptionDao<Book, Integer> bookDAO = getHelper().getBookDataDao(); QueryBuilder<Book, Integer> queryBuilder = bookDAO.queryBuilder(); Where<Book, Integer> where = queryBuilder.where(); where.and( where.eq("title", "Croc Blanc"), where.or( where.eq("nbPage", 248), where.eq("nbPage", 317) ) ); List<Book> books = bookDAO.query(queryBuilder.prepare()); for (Book book : books) { Log.w("READ BY QUERY", book.toString()); } } Builder Prépare la requête
  • 74. session sept 2014 Yann Caron (c) 2014 74 Avantages/inconvénients ?  Avantages : ➔ Séparation des responsabilités ➔ Moins de code que précédemment (les POJO et un helper) ➔ Un builder pour créer les queries (plus de SQL)  Inconvénients ➔ Pas vraiment typés non plus (where.eq) ➔ Mapping Relationel/Objet = complexité supplémentaire
  • 75. session sept 2014 Yann Caron (c) 2014 75 IN01 – Séance 04 NoSQL - OODBMS - DB4Object
  • 76. session sept 2014 Yann Caron (c) 2014 76 DB4Object  Créé par Versant en 2000  Double licence : OpenSource GPL/Commerciale  Compatible Java et .net  Divers secteurs d'activités (Mobile, Navigation, SCADA, Devices and equipments, Domotique)  Embarquable sur Android  NoSQL/OODBMS  Des outils de management (plugins Eclipse ou VisualStudio)  Réplication objet ou relationnelle
  • 77. session sept 2014 Yann Caron (c) 2014 77 Réplication  Réplication bidirectionnelle  Avec des SGBDR via Hibernate
  • 78. session sept 2014 Yann Caron (c) 2014 78 Performances  Réalisé par Versant, sur un graph complexe d'objets et un héritage de 5 niveaux
  • 79. session sept 2014 Yann Caron (c) 2014 79 Nos POJO  L'ID n'est plus nécessaire : relations basées sur les pointeurs  Réduit à sa plus simple expression public class Book { // attributes private String title; private String isbn; private int nbPage; // accessors public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } // etc. // constructor …. // toString ….
  • 80. session sept 2014 Yann Caron (c) 2014 80 Mise en œuvre  user-permission WRITE_EXTERNAL_STORAGE public static final String DB_FILE = root + "/db.db4o"; private void doSomeBookStuff(ObjectContainer db) { Book book1 = new Book("Croc Blanc", "2010034031", 248); Book book2 = new Book("L'appel de la forêt", "2253039861", 158); db.store(book1); db.store(book2); ObjectSet<Book> result = db.queryByExample(Book.class); for (Book p : result) { textview.append("DB4O SELECT ALL Book " + p + " loaded !n"); } } } Méthode store()
  • 81. session sept 2014 Yann Caron (c) 2014 81 Mise en œuvre  La gestion du modèle devient inutile, DB4O se charge de tout ➔ Ou presque : veiller à toujours utiliser les mêmes noms de classe, sinon prévoir de configurer la transition  Insert ou Update automatique
  • 82. session sept 2014 Yann Caron (c) 2014 82 Héritage private void doSomeHierarchicalStuff(ObjectContainer db) { Department root = new Department("T"); Department td = new Department("D"); Department to = new Department("O"); root.addChild(td); root.addChild(to); db.store(root); db.store(new Person("Johanna", "Caron", 26)); db.store(new Employe(td, "Yann", "Caron", 34)); ObjectSet<Person> result = db.queryByExample(Person.class); for (Person p : result) { textview.append("DB4O HIERARCHICAL Object " + p + " loaded !n"); } }
  • 83. session sept 2014 Yann Caron (c) 2014 83 Héritage  Un employé est une personne avec un département rattaché  Les départements sont organisés de façon hiérarchique (Design pattern composite)  Les relations sont établies sur les pointeurs entre objets  Aucun mapping !
  • 84. session sept 2014 Yann Caron (c) 2014 84 Mise en œuvre  La gestion du modèle devient inutile, DB4O se charge de tout ➔ Ou presque : veiller à toujours utiliser les mêmes noms de classe, sinon prévoir de configurer la transition  Insert ou Update automatique
  • 85. session sept 2014 Yann Caron (c) 2014 85 Requêtes  Trois façons d'effectuer des requêtes : ➔ QBE, Query By Example : le plus simple, on donne un objet en exemple, et DB4O retourne tout ce qui y ressemble ➔ NQ, Native Query : ressemble à du fonctionnel ➔ SODA : Builder de bas niveau, base de construction des deux précédentes  Vivement une implémentation pour le JDK8 (Map, Filter, Reduce)
  • 86. session sept 2014 Yann Caron (c) 2014 86 Query By Example  Principe : créer un objet vide  Ne renseigner que les champs qui sont l'objet de la recherche private void doQBEDBStuff(ObjectContainer db) { ObjectSet<Book> result = db.queryByExample(new Book("Croc Blanc", null, 0)); for (Book p : result) { textview.append("DB4O QBE Object " + p + " loaded !n"); } }
  • 87. session sept 2014 Yann Caron (c) 2014 87 Native Query  Predicat ! Jointure ? private void doNQDBStuff(ObjectContainer db) { ObjectSet<Book> result = db.query(new Predicate<Book>() { @Override public boolean match(Book book) { return "Croc Blanc".equals(book.getTitle()); } }); for (Book p : result) { textview.append("DB4O NQ1 Object " + p + " loaded !n"); } ObjectSet<Employe> result2 = db.query(new Predicate<Employe>() { @Override public boolean match(Employe person) { textview.append("NQ2 PREDICATE departement = " + person.getDepartement().getName() + "n"); return "TD".equals(person.getDepartement().getName()); } }); for (Employe e : result2) { textview.append("DB4O NQ2 Object " + e + " loaded !n"); } } Un prédicat
  • 88. session sept 2014 Yann Caron (c) 2014 88 SODA  Ressemble au QueryBuilder vu précédemment  Plus puissant que les deux précédentes méthodes private void doSODADBStuff(ObjectContainer db) { Query query = db.query(); query.constrain(Book.class); query.descend("title").constrain("Croc Blanc").equal(); ObjectSet<Book> result = query.execute(); for (Book p : result) { textview.append("DB4O SODA Object " + p + " loaded !n"); } }
  • 89. session sept 2014 Yann Caron (c) 2014 89 Constat  Modèle complexe qui ne pose aucun problème de persistance  Le code est minimal  La mise à jour du modèle est automatique  La gestion create/update également  Types complexes (tout ce que l'on peut imaginer avec les objets) ➔ Composite ➔ Interpréter (faire persister des comportements à interpréter, des formules de calculs par exemple) ➔ Réseaux (réseaux de neurones ?)
  • 90. session sept 2014 Yann Caron (c) 2014 90 Et bien plus encore  De bonnes performances annoncées  Un “foot print” de 1MB sur le disque  Une synchronisation prévue avec les SGBDR  Couche réseau optionnelle ➔ Mode client/serveur ➔ Publish/Subscribe pour synchroniser les clients
  • 91. session sept 2014 Yann Caron (c) 2014 91 Pour aller plus loin !  Intégration avec les lambdas de Java 8 ?  Qu'en est-il des bases de données NoSQL de type document : ➔ JasDB ➔ CouchDB CouchBaseLite (plus complexe de→ mise en œuvre que db4o) ➔ SnappyDB : Clé/Valeurs, c'est tout !?!?
  • 92. session sept 2014 Yann Caron (c) 2014 92 Bibliographie  SQLite : http://www.sqlite.org/  SQLite sur Developpez.com : http://a-renouard.developpez.com/tutoriels/and roid/sqlite/  SQLite-Sync : http://sqlite-sync.com/  db4objects : http://www.db4o.com/
  • 93. session sept 2014 Yann Caron (c) 2014 93 Sources de la présentation  Trouvez toutes les sources de la présentation sur Bitbucket https://bitbucket.org/yann_caron/in01/src/
  • 94. session sept 2014 Yann Caron (c) 2014 94 Fin  Merci de votre attention  Des questions ?