SlideShare a Scribd company logo
1 of 51
Download to read offline
Room VS Realm
PAUG - 29 novembre 2017
Smart&Soft
Agence Digitale
2017
2
Sommaire
ROOM VS REALM
• La base de données historique : SQLite
• Présentation d’un ORM
• Comparaison de Realm et Room
SQLite
Smart&Soft
Agence Digitale
2017
4
Définition
SQLite
“Bibliothèque [...] qui propose un moteur de base de données
relationnelle accessible par le langage SQL”
Source : https://fr.wikipedia.org/wiki/SQLite
Smart&Soft
Agence Digitale
2017
5
Avantages
SQLite
• SQL
• Base de données embarquée
• SGBD complet :
• gestion des transactions
• gestion des triggers
• gestion des vues
• etc.
Smart&Soft
Agence Digitale
2017
6
Inconvénients
SQLite
• SQL
• Comment faire de l’objet ?
• pattern DAO
• pattern repository
• etc.
Qu’est-ce
qu’un ORM ?
Smart&Soft
Agence Digitale
2017
8
Définition
ORM
“Un mapping objet-relationnel est une technique de
programmation informatique qui crée l'illusion d'une base
de données orientée objet à partir d'une base de données
relationnelle en définissant des correspondances entre
cette base de données et les objets du langage utilisé”
Source : https://fr.wikipedia.org/wiki/Mapping_objet-relationnel
Smart&Soft
Agence Digitale
2017
9
Quelques
ORM
ORM
• ORMLite : http://ormlite.com/
• ActiveAndroid : http://www.activeandroid.com/
• GreenDAO : http://greenrobot.org/greendao/
• SugarORM : http://satyan.github.io/sugar/
• Freezer : https://github.com/florent37/Freezer
Smart&Soft
Agence Digitale
2017
10
Dans les
autres OS
ORM
Entity Framework Core
Core Data
Room
VS
Realm
2017
12
Définitions
1. Quelques définitions
Smart&Soft
Agence Digitale
2017
13
Définition
Realm
“Realm Mobile Database is an alternative to SQLite and Core
Data. Thanks to its zero-copy design, Realm Mobile
Database is much faster than an ORM, and often faster than
raw SQLite.”
Source : https://realm.io/products/realm-mobile-database/
Smart&Soft
Agence Digitale
2017
14
Définition
Room
“Room provides an abstraction layer over SQLite to allow
fluent database access while harnessing the full power of
SQLite.”
Source : https://developer.android.com/topic/libraries/architecture/room.html
2017
15
Architecture
2. Architecture
2017
16
Smart&Soft
Agence Digitale
Room
ARCHITECTURE
• Fonctionne par-dessus SQLite
• Fonctionne avec 3 éléments :
• Database
• Entity
• DAO
• Copie les éléments de la base de
données vers des objets
2017
17
Smart&Soft
Agence Digitale
Realm
ARCHITECTURE
• Système de références
• Travail avec un arbre
• Fonctionne à partir d’objets “Proxy”
• Promesse de “zero copy”
• Promesse de rapidité
2017
18
Comparaison
3. Comparaison
Smart&Soft
Agence Digitale
2017
19
Les points de
comparaison
COMPARAISON
1. Configuration
2. Gestion d’une entité avec des relations
3. Les requêtes
4. Rapidité d’exécution
5. Gestion de la migration
6. D’autres éléments (RxJava, poids, nombre de méthodes,
threading, etc.)
2017
20
Smart&Soft
Agence Digitale
Realm
1. CONFIGURATION
1. Ajout d’une dépendance dans le fichier build.gradle du projet
dependencies {
classpath "io.realm:realm-gradle-plugin:4.2.0"
}
2. Application du plugin dans le fichier build.gradle du module
apply plugin: "realm-android"
3. Initialisation de Realm
Realm.init(this);
Realm.setDefaultConfiguration(
new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().schemaVersion(1).build());
2017
21
Smart&Soft
Agence Digitale
Room
1. CONFIGURATION
1. Ajout d’une nouvelle source dans le fichier build.gradle du projet
maven { url "https://maven.google.com" } // google()
2. Ajout des dépendances dans le fichier build.gradle du module
compile("android.arch.persistence.room:runtime:1.0.0")
annotationProcessor("android.arch.persistence.room:compiler:1.0.0")
3. Initialisation de Room à remettre à plus tard !
2017
22
2. Gestion d’une entité avec des relations
COMPARAISON
2017
23
Smart&Soft
Agence Digitale
Realm
2. Gestion d’une entité avec des relations
public class RealmCat
extends RealmObject
{
@PrimaryKey
private int id;
private int age;
private String name;
//Getters and setters
}
public class RealmDog extends RealmObject {
public enum RealmColor { Black, White }
@PrimaryKey
private int id;
private int age;
private String name;
private String color;
//Getters and setters
public RealmColor getRealmColor() {
return color != null ?
RealmColor.valueOf(color) :
null;
}
public void setRealmColor(RealmColor color){
this.color = color.toString();
}
}
2017
24
Smart&Soft
Agence Digitale
Realm
2. Gestion d’une entité avec des relations
public class RealmPerson
extends RealmObject
{
@PrimaryKey
private int id;
private String name;
private RealmList<RealmDog> dogs;
private RealmList<RealmCat> cats;
//Getters and setters
}
2017
25
Bilan provisoire
2. Gestion d’une entité avec des relations
• Modélisation très simple
• Gestion des relations efficaces
• Héritage impossible (contournement possible via des objets composites)
• Pas d’auto-incrémentation de la clef primaire
• Pas de gestion des énumérations
2017
26
Smart&Soft
Agence Digitale
Room
2. Gestion d’une entité avec des relations
public abstract class RoomAnimal
{
@PrimaryKey
public int id;
public int age;
public String name;
}
@Entity(tableName = "cat")
public final class RoomCat
extends RoomAnimal
{
}
2017
27
Smart&Soft
Agence Digitale
Room
2. Gestion d’une entité avec des relations
@Entity(tableName = "dog")
public final class RoomDog
extends RoomAnimal
{
public enum RoomColor
{
Black, White
}
@TypeConverters(RoomColorConverter.class)
public RoomColor color;
}
public final class RoomColorConverter
{
@TypeConverter
public RoomColor fromString(String color)
{
return color != null ?
RoomColor.valueOf(color) : null;
}
@TypeConverter
public String fromRealmColor(RoomColor color)
{
return color.toString();
}
}
2017
28
Smart&Soft
Agence Digitale
Room
2. Gestion d’une entité avec des relations
@Entity(tableName = "person")
public final class RoomPerson
{
@PrimaryKey
public int id;
public String name;
}
public final class RoomPersonWithAnimals
{
@Embedded
public RoomPerson person;
@Relation(parentColumn = "id",
entityColumn = "id",
entity = RoomDog.class)
public List<RoomDog> dogs;
@Relation(parentColumn = "id",
entityColumn = "id",
entity = RoomCat.class)
public List<RoomCat> cats;
}
C’est pas fini...
2017
30
Smart&Soft
Agence Digitale
Room
2. Gestion d’une entité avec des relations
@Entity(
tableName = "Person_has_Cat",
primaryKeys = { "personId", "catId" },
foreignKeys = {
@ForeignKey(entity = RoomPerson.class,
parentColumns = "id",
childColumns = "personId",
onDelete = ForeignKey.CASCADE),
@ForeignKey(entity = RoomCat.class,
parentColumns = "id",
childColumns = "catId",
onDelete = ForeignKey.CASCADE) })
public final class RoomPersonCat
{
public int personId;
public int catId;
}
@Entity(
tableName = "Person_has_Dog",
primaryKeys = { "personId", "dogId" },
foreignKeys = {
@ForeignKey(entity = RoomPerson.class,
parentColumns = "id",
childColumns = "personId",
onDelete = ForeignKey.CASCADE),
@ForeignKey(entity = RoomDog.class,
parentColumns = "id",
childColumns = "dogId",
onDelete = ForeignKey.CASCADE) })
public final class RoomPersonDog
{
public int personId;
public int dogId;
}
2017
31
Bilan provisoire
2. Gestion d’une entité avec des relations
• Gestion de l’auto-incrémentation de la clef primaire
• Possibilité d’héritage
• Modélisation plus complexe
• Références d’objets impossible
(https://developer.android.com/training/data-storage/room/referencing-data.html)
2017
32
Smart&Soft
Agence Digitale
Realm
3. Les requêtes
//1. Récupération d'une instance de Realm
final Realm realm = Realm.getDefaultInstance();
//2. Création d'une transaction
realm.beginTransaction();
//3. Exécution de la requête
realm.copyToRealmOrUpdate(persons);
//4. On termine la transaction et on ferme l'instance de Realm
realm.commitTransaction();
realm.close();
Possibilité d’utiliser executeTransaction pour une gestion des erreurs simplifiée
2017
33
Smart&Soft
Agence Digitale
Realm
3. Les requêtes
Requête de sélection
Requête de mise à jour
final Realm realm = Realm.getDefaultInstance();
final RealmPerson persons = realm.copyFromRealm(realm.where(RealmPerson.class).equalTo("id", 299).findFirst());
realm.close();
final Realm realm = Realm.getDefaultInstance();
final RealmPerson persons = realm.where(RealmPerson.class).equalTo("id", 299).findFirst();
persons.setName(UUID.randomUUID().toString());
realm.close();
2017
34
Smart&Soft
Agence Digitale
Realm
3. Les requêtes
Requête de suppression
final Realm realm = Realm.getDefaultInstance();
final RealmPerson persons = realm.where(RealmPerson.class).equalTo("id", 299).findFirst();
persons.deleteFromRealm();
realm.close();
2017
35
Bilan provisoire
3. Les requêtes
• Écriture des requêtes hyper simplifié
• Possibilité de faire des requêtes dans le thread de l’UI
• Résultats “vivants” par défaut (attention au threading !)
• Impossibilité de faire des requêtes très fines :
• Récupérer les chiens noirs d’une personne
2017
36
Smart&Soft
Agence Digitale
Room
3. Les requêtes
@Dao
public interface RoomGenericDao<T>
{
@Insert(
onConflict = OnConflictStrategy.REPLACE)
void insert(T bo);
@Insert(
onConflict = OnConflictStrategy.REPLACE)
void insertAll(T... bo);
@Delete
void delete(T bo);
@Update
void update(T bo);
}
@Dao
public interface RoomCatDao
extends RoomGenericDao<RoomCat>
{
@Query("SELECT * FROM cat")
List<RoomCat> getAll();
@Query("SELECT * FROM cat WHERE id = :id")
RoomCat findById(int id);
}
2017
37
Smart&Soft
Agence Digitale
Room
3. Les requêtes
@Dao
public interface RoomDogDao
extends RoomGenericDao<RoomDog>
{
@Query("SELECT * FROM dog")
List<RoomDog> getAll();
@Query("SELECT * FROM dog WHERE id = :id")
RoomDog findById(int id);
}
@Dao
public interface RoomPersonDao
extends RoomGenericDao<RoomPerson>
{
@Query("SELECT * FROM person")
List<RoomPersonWithAnimals> getAll();
@Query("SELECT * FROM person WHERE id = :id")
RoomPersonWithAnimals findById(int id);
}
2017
38
Smart&Soft
Agence Digitale
Room
3. Les requêtes
1. Création d’une classe abstraite pour exposer les DAO et les entités managés
@Database(entities = { RoomCat.class, RoomDog.class, RoomPerson.class, RoomPersonCat.class,
RoomPersonDog.class }, version = 1, exportSchema = false)
public abstract class MyRoomDatabase extends RoomDatabase {
public abstract RoomCatDao roomCatDao();
public abstract RoomDogDao roomDogDao();
public abstract RoomPersonDao roomPersonDao();
}
2. Instanciation de la classe
myRoomDatabase = Room.databaseBuilder(this, MyRoomDatabase.class, "myRoomDatabase").build();
2017
39
Smart&Soft
Agence Digitale
Room
3. Les requêtes
Possibilité d’utiliser runInTransaction
//1. Création d'une transaction (facultatif) → Interdit dans le main thread
myRoomDatabase.beginTransaction();
//2. Exécution de la requête
myRoomDatabase.roomPersonDao().insertAll(person);
//3. On indique que tout s’est bien passé
myRoomDatabase.setTransactionSuccessful();
//4. On termine la transaction
myRoomDatabase.endTransaction();
2017
40
Smart&Soft
Agence Digitale
Room
3. Les requêtes
Requête de sélection
Requête de mise à jour
final RoomPersonWithAnimals personWithAnimals =myRoomDatabase.roomPersonDao().findById(299);
final RoomPersonWithAnimals personWithAnimals =myRoomDatabase.roomPersonDao().findById(299);
personWithAnimals.person.name = UUID.randomUUID().toString();
myRoomDatabase.roomPersonDao().update(personWithAnimals.person);
Requête de suppression
final RoomPersonWithAnimals persons =myRoomDatabase.roomPersonDao().findById(43);
myRoomDatabase.roomPersonDao().delete(persons.person);
2017
41
Smart&Soft
Agence Digitale
Room
3. Les requêtes
final List<RoomPersonWithAnimals> personsWithAnimals = new ArrayList<>();
for (int index = 0; index <NUMBER_OF_ITEMS; index++) { /*...*/ }
//1. Création d'une transaction (facultatif)
myRoomDatabase.beginTransaction();
//2. Insertion des éléments
for (RoomPersonWithAnimals personAnimals : personsWithAnimals) {
myRoomDatabase.roomPersonDao().insert(personAnimals.person);
myRoomDatabase.roomCatDao().insertAll(personWithAnimals.cats.toArray(newRoomCat[personWithAnimals.cats.size()]);
myRoomDatabase.roomDogDao().insertAll(personWithAnimals.dogs.toArray(newRoomDog[personWithAnimals.dogs.size()]));
for (RoomCat cat : personWithAnimals.cats) {
myRoomDatabase.roomPersonCatDao().insert(new RoomPersonCat(personWithAnimals.person.id, cat.id));
}
for (RoomDog dog : personWithAnimals.dogs){
myRoomDatabase.roomPersonDogDao().insert(new RoomPersonDog(personWithAnimals.person.id, dog.id));
}
}
//3. On termine la transaction
myRoomDatabase.setTransactionSuccessful();
myRoomDatabase.endTransaction();
2017
42
Bilan provisoire
3. Les requêtes
• Rude...
• Par défaut impossibilité de faire des requêtes dans le thread de l’UI
• SQL
2017
43
Smart&Soft
Agence Digitale
3. Les performances
2017
44
Smart&Soft
Agence Digitale
3. Les performances
Room Realm
Insertion de beaucoup de
données
10 991 ms 2 587 ms
Insertion d’une ligne 6 ms 4 ms
Sélection 3 ms 26 ms
Suppression 7 ms 15 ms
Mise à jour 4 ms 4 ms
2017
45
Realm
4. Gestion de la migration
• Possibilité de détruire la base de données existante
• Possibilité de gérer une migration via l’interface RealmMigration
• Migration orientée objet
2017
46
Room
4. Gestion de la migration
• Possibilité de gérer plusieurs migrations via la classe Migration
• Migration orientée SQL
• Possibilité de faire des tests unitaires sur la migration d’une base de données
• Possibilité d’exporter le schéma de base de données au format JSON
2017
47
Smart&Soft
Agence Digitale
5. Autres éléments de comparaison
Room Realm
Données “observables”
RxJava 2
LiveData
RxJava 1 jusqu’à Realm 3.x
RxJava 2 depuis Realm 4
Méthodes 486 2468
Classes / Interfaces
générées
6 8
Poids négligeable ~ 14 MB
Conclusion
Smart&Soft
Agence Digitale
2017
49
Liens utiles • https://realm.io/docs/java/latest/
• https://developer.android.com/topic/libraries/architecture/room.h
tml
Des questions ?
92 rue Réaumur - 75 002 -
Paris
contact@smartnsoft.com
www.smartnsoft.com
01 42 12 28 41

More Related Content

Similar to Room ou Realm : Quelle base de données pour vos applications Android ?

HTML 5 et CSS3, créez, animez et enrichissez vos sites Web
HTML 5 et CSS3, créez, animez et enrichissez vos sites WebHTML 5 et CSS3, créez, animez et enrichissez vos sites Web
HTML 5 et CSS3, créez, animez et enrichissez vos sites WebMicrosoft
 
Gestion des données d'entreprise à l'ère de MongoDB et du Data Lake
Gestion des données d'entreprise à l'ère de MongoDB et du Data LakeGestion des données d'entreprise à l'ère de MongoDB et du Data Lake
Gestion des données d'entreprise à l'ère de MongoDB et du Data LakeMongoDB
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...Publicis Sapient Engineering
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
 
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...sebastienmoreno
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Laurent Guérin
 
Infrastructure - Monitoring - Cacti
Infrastructure - Monitoring - CactiInfrastructure - Monitoring - Cacti
Infrastructure - Monitoring - CactiFrédéric FAURE
 
Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013Philippe Sfeir
 
applications-reparties
applications-repartiesapplications-reparties
applications-repartiesmourad50
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db firstZineb ELGARRAI
 
Activity
ActivityActivity
Activitydido
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaMicrosoft
 
OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015Tarik Zakaria Benmerar
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Paris Container Day 2016 : Architecture microservices hautement disponible au...
Paris Container Day 2016 : Architecture microservices hautement disponible au...Paris Container Day 2016 : Architecture microservices hautement disponible au...
Paris Container Day 2016 : Architecture microservices hautement disponible au...Publicis Sapient Engineering
 

Similar to Room ou Realm : Quelle base de données pour vos applications Android ? (20)

HTML 5 et CSS3, créez, animez et enrichissez vos sites Web
HTML 5 et CSS3, créez, animez et enrichissez vos sites WebHTML 5 et CSS3, créez, animez et enrichissez vos sites Web
HTML 5 et CSS3, créez, animez et enrichissez vos sites Web
 
Gestion des données d'entreprise à l'ère de MongoDB et du Data Lake
Gestion des données d'entreprise à l'ère de MongoDB et du Data LakeGestion des données d'entreprise à l'ère de MongoDB et du Data Lake
Gestion des données d'entreprise à l'ère de MongoDB et du Data Lake
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services  Par Al...
XebiCon'16 : Choisissez votre style avec Docker & Amazon Web Services Par Al...
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
 
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...
Lost in serverless AWS Lambda, Google Cloud Function, Azure Function quelle s...
 
Support Java Avancé Troisième Partie
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième Partie
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
Infrastructure - Monitoring - Cacti
Infrastructure - Monitoring - CactiInfrastructure - Monitoring - Cacti
Infrastructure - Monitoring - Cacti
 
Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013Tableau de bord Yammer sous SharePoint 2013
Tableau de bord Yammer sous SharePoint 2013
 
applications-reparties
applications-repartiesapplications-reparties
applications-reparties
 
Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db first
 
Activity
ActivityActivity
Activity
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
 
OOP and Design Patterns
OOP and Design PatternsOOP and Design Patterns
OOP and Design Patterns
 
OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015OOP & Design Pattern - Algiers Developers Meetup August 2015
OOP & Design Pattern - Algiers Developers Meetup August 2015
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Paris Container Day 2016 : Architecture microservices hautement disponible au...
Paris Container Day 2016 : Architecture microservices hautement disponible au...Paris Container Day 2016 : Architecture microservices hautement disponible au...
Paris Container Day 2016 : Architecture microservices hautement disponible au...
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 

Room ou Realm : Quelle base de données pour vos applications Android ?

  • 1. Room VS Realm PAUG - 29 novembre 2017
  • 2. Smart&Soft Agence Digitale 2017 2 Sommaire ROOM VS REALM • La base de données historique : SQLite • Présentation d’un ORM • Comparaison de Realm et Room
  • 4. Smart&Soft Agence Digitale 2017 4 Définition SQLite “Bibliothèque [...] qui propose un moteur de base de données relationnelle accessible par le langage SQL” Source : https://fr.wikipedia.org/wiki/SQLite
  • 5. Smart&Soft Agence Digitale 2017 5 Avantages SQLite • SQL • Base de données embarquée • SGBD complet : • gestion des transactions • gestion des triggers • gestion des vues • etc.
  • 6. Smart&Soft Agence Digitale 2017 6 Inconvénients SQLite • SQL • Comment faire de l’objet ? • pattern DAO • pattern repository • etc.
  • 8. Smart&Soft Agence Digitale 2017 8 Définition ORM “Un mapping objet-relationnel est une technique de programmation informatique qui crée l'illusion d'une base de données orientée objet à partir d'une base de données relationnelle en définissant des correspondances entre cette base de données et les objets du langage utilisé” Source : https://fr.wikipedia.org/wiki/Mapping_objet-relationnel
  • 9. Smart&Soft Agence Digitale 2017 9 Quelques ORM ORM • ORMLite : http://ormlite.com/ • ActiveAndroid : http://www.activeandroid.com/ • GreenDAO : http://greenrobot.org/greendao/ • SugarORM : http://satyan.github.io/sugar/ • Freezer : https://github.com/florent37/Freezer
  • 10. Smart&Soft Agence Digitale 2017 10 Dans les autres OS ORM Entity Framework Core Core Data
  • 13. Smart&Soft Agence Digitale 2017 13 Définition Realm “Realm Mobile Database is an alternative to SQLite and Core Data. Thanks to its zero-copy design, Realm Mobile Database is much faster than an ORM, and often faster than raw SQLite.” Source : https://realm.io/products/realm-mobile-database/
  • 14. Smart&Soft Agence Digitale 2017 14 Définition Room “Room provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of SQLite.” Source : https://developer.android.com/topic/libraries/architecture/room.html
  • 16. 2017 16 Smart&Soft Agence Digitale Room ARCHITECTURE • Fonctionne par-dessus SQLite • Fonctionne avec 3 éléments : • Database • Entity • DAO • Copie les éléments de la base de données vers des objets
  • 17. 2017 17 Smart&Soft Agence Digitale Realm ARCHITECTURE • Système de références • Travail avec un arbre • Fonctionne à partir d’objets “Proxy” • Promesse de “zero copy” • Promesse de rapidité
  • 19. Smart&Soft Agence Digitale 2017 19 Les points de comparaison COMPARAISON 1. Configuration 2. Gestion d’une entité avec des relations 3. Les requêtes 4. Rapidité d’exécution 5. Gestion de la migration 6. D’autres éléments (RxJava, poids, nombre de méthodes, threading, etc.)
  • 20. 2017 20 Smart&Soft Agence Digitale Realm 1. CONFIGURATION 1. Ajout d’une dépendance dans le fichier build.gradle du projet dependencies { classpath "io.realm:realm-gradle-plugin:4.2.0" } 2. Application du plugin dans le fichier build.gradle du module apply plugin: "realm-android" 3. Initialisation de Realm Realm.init(this); Realm.setDefaultConfiguration( new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().schemaVersion(1).build());
  • 21. 2017 21 Smart&Soft Agence Digitale Room 1. CONFIGURATION 1. Ajout d’une nouvelle source dans le fichier build.gradle du projet maven { url "https://maven.google.com" } // google() 2. Ajout des dépendances dans le fichier build.gradle du module compile("android.arch.persistence.room:runtime:1.0.0") annotationProcessor("android.arch.persistence.room:compiler:1.0.0") 3. Initialisation de Room à remettre à plus tard !
  • 22. 2017 22 2. Gestion d’une entité avec des relations COMPARAISON
  • 23. 2017 23 Smart&Soft Agence Digitale Realm 2. Gestion d’une entité avec des relations public class RealmCat extends RealmObject { @PrimaryKey private int id; private int age; private String name; //Getters and setters } public class RealmDog extends RealmObject { public enum RealmColor { Black, White } @PrimaryKey private int id; private int age; private String name; private String color; //Getters and setters public RealmColor getRealmColor() { return color != null ? RealmColor.valueOf(color) : null; } public void setRealmColor(RealmColor color){ this.color = color.toString(); } }
  • 24. 2017 24 Smart&Soft Agence Digitale Realm 2. Gestion d’une entité avec des relations public class RealmPerson extends RealmObject { @PrimaryKey private int id; private String name; private RealmList<RealmDog> dogs; private RealmList<RealmCat> cats; //Getters and setters }
  • 25. 2017 25 Bilan provisoire 2. Gestion d’une entité avec des relations • Modélisation très simple • Gestion des relations efficaces • Héritage impossible (contournement possible via des objets composites) • Pas d’auto-incrémentation de la clef primaire • Pas de gestion des énumérations
  • 26. 2017 26 Smart&Soft Agence Digitale Room 2. Gestion d’une entité avec des relations public abstract class RoomAnimal { @PrimaryKey public int id; public int age; public String name; } @Entity(tableName = "cat") public final class RoomCat extends RoomAnimal { }
  • 27. 2017 27 Smart&Soft Agence Digitale Room 2. Gestion d’une entité avec des relations @Entity(tableName = "dog") public final class RoomDog extends RoomAnimal { public enum RoomColor { Black, White } @TypeConverters(RoomColorConverter.class) public RoomColor color; } public final class RoomColorConverter { @TypeConverter public RoomColor fromString(String color) { return color != null ? RoomColor.valueOf(color) : null; } @TypeConverter public String fromRealmColor(RoomColor color) { return color.toString(); } }
  • 28. 2017 28 Smart&Soft Agence Digitale Room 2. Gestion d’une entité avec des relations @Entity(tableName = "person") public final class RoomPerson { @PrimaryKey public int id; public String name; } public final class RoomPersonWithAnimals { @Embedded public RoomPerson person; @Relation(parentColumn = "id", entityColumn = "id", entity = RoomDog.class) public List<RoomDog> dogs; @Relation(parentColumn = "id", entityColumn = "id", entity = RoomCat.class) public List<RoomCat> cats; }
  • 30. 2017 30 Smart&Soft Agence Digitale Room 2. Gestion d’une entité avec des relations @Entity( tableName = "Person_has_Cat", primaryKeys = { "personId", "catId" }, foreignKeys = { @ForeignKey(entity = RoomPerson.class, parentColumns = "id", childColumns = "personId", onDelete = ForeignKey.CASCADE), @ForeignKey(entity = RoomCat.class, parentColumns = "id", childColumns = "catId", onDelete = ForeignKey.CASCADE) }) public final class RoomPersonCat { public int personId; public int catId; } @Entity( tableName = "Person_has_Dog", primaryKeys = { "personId", "dogId" }, foreignKeys = { @ForeignKey(entity = RoomPerson.class, parentColumns = "id", childColumns = "personId", onDelete = ForeignKey.CASCADE), @ForeignKey(entity = RoomDog.class, parentColumns = "id", childColumns = "dogId", onDelete = ForeignKey.CASCADE) }) public final class RoomPersonDog { public int personId; public int dogId; }
  • 31. 2017 31 Bilan provisoire 2. Gestion d’une entité avec des relations • Gestion de l’auto-incrémentation de la clef primaire • Possibilité d’héritage • Modélisation plus complexe • Références d’objets impossible (https://developer.android.com/training/data-storage/room/referencing-data.html)
  • 32. 2017 32 Smart&Soft Agence Digitale Realm 3. Les requêtes //1. Récupération d'une instance de Realm final Realm realm = Realm.getDefaultInstance(); //2. Création d'une transaction realm.beginTransaction(); //3. Exécution de la requête realm.copyToRealmOrUpdate(persons); //4. On termine la transaction et on ferme l'instance de Realm realm.commitTransaction(); realm.close(); Possibilité d’utiliser executeTransaction pour une gestion des erreurs simplifiée
  • 33. 2017 33 Smart&Soft Agence Digitale Realm 3. Les requêtes Requête de sélection Requête de mise à jour final Realm realm = Realm.getDefaultInstance(); final RealmPerson persons = realm.copyFromRealm(realm.where(RealmPerson.class).equalTo("id", 299).findFirst()); realm.close(); final Realm realm = Realm.getDefaultInstance(); final RealmPerson persons = realm.where(RealmPerson.class).equalTo("id", 299).findFirst(); persons.setName(UUID.randomUUID().toString()); realm.close();
  • 34. 2017 34 Smart&Soft Agence Digitale Realm 3. Les requêtes Requête de suppression final Realm realm = Realm.getDefaultInstance(); final RealmPerson persons = realm.where(RealmPerson.class).equalTo("id", 299).findFirst(); persons.deleteFromRealm(); realm.close();
  • 35. 2017 35 Bilan provisoire 3. Les requêtes • Écriture des requêtes hyper simplifié • Possibilité de faire des requêtes dans le thread de l’UI • Résultats “vivants” par défaut (attention au threading !) • Impossibilité de faire des requêtes très fines : • Récupérer les chiens noirs d’une personne
  • 36. 2017 36 Smart&Soft Agence Digitale Room 3. Les requêtes @Dao public interface RoomGenericDao<T> { @Insert( onConflict = OnConflictStrategy.REPLACE) void insert(T bo); @Insert( onConflict = OnConflictStrategy.REPLACE) void insertAll(T... bo); @Delete void delete(T bo); @Update void update(T bo); } @Dao public interface RoomCatDao extends RoomGenericDao<RoomCat> { @Query("SELECT * FROM cat") List<RoomCat> getAll(); @Query("SELECT * FROM cat WHERE id = :id") RoomCat findById(int id); }
  • 37. 2017 37 Smart&Soft Agence Digitale Room 3. Les requêtes @Dao public interface RoomDogDao extends RoomGenericDao<RoomDog> { @Query("SELECT * FROM dog") List<RoomDog> getAll(); @Query("SELECT * FROM dog WHERE id = :id") RoomDog findById(int id); } @Dao public interface RoomPersonDao extends RoomGenericDao<RoomPerson> { @Query("SELECT * FROM person") List<RoomPersonWithAnimals> getAll(); @Query("SELECT * FROM person WHERE id = :id") RoomPersonWithAnimals findById(int id); }
  • 38. 2017 38 Smart&Soft Agence Digitale Room 3. Les requêtes 1. Création d’une classe abstraite pour exposer les DAO et les entités managés @Database(entities = { RoomCat.class, RoomDog.class, RoomPerson.class, RoomPersonCat.class, RoomPersonDog.class }, version = 1, exportSchema = false) public abstract class MyRoomDatabase extends RoomDatabase { public abstract RoomCatDao roomCatDao(); public abstract RoomDogDao roomDogDao(); public abstract RoomPersonDao roomPersonDao(); } 2. Instanciation de la classe myRoomDatabase = Room.databaseBuilder(this, MyRoomDatabase.class, "myRoomDatabase").build();
  • 39. 2017 39 Smart&Soft Agence Digitale Room 3. Les requêtes Possibilité d’utiliser runInTransaction //1. Création d'une transaction (facultatif) → Interdit dans le main thread myRoomDatabase.beginTransaction(); //2. Exécution de la requête myRoomDatabase.roomPersonDao().insertAll(person); //3. On indique que tout s’est bien passé myRoomDatabase.setTransactionSuccessful(); //4. On termine la transaction myRoomDatabase.endTransaction();
  • 40. 2017 40 Smart&Soft Agence Digitale Room 3. Les requêtes Requête de sélection Requête de mise à jour final RoomPersonWithAnimals personWithAnimals =myRoomDatabase.roomPersonDao().findById(299); final RoomPersonWithAnimals personWithAnimals =myRoomDatabase.roomPersonDao().findById(299); personWithAnimals.person.name = UUID.randomUUID().toString(); myRoomDatabase.roomPersonDao().update(personWithAnimals.person); Requête de suppression final RoomPersonWithAnimals persons =myRoomDatabase.roomPersonDao().findById(43); myRoomDatabase.roomPersonDao().delete(persons.person);
  • 41. 2017 41 Smart&Soft Agence Digitale Room 3. Les requêtes final List<RoomPersonWithAnimals> personsWithAnimals = new ArrayList<>(); for (int index = 0; index <NUMBER_OF_ITEMS; index++) { /*...*/ } //1. Création d'une transaction (facultatif) myRoomDatabase.beginTransaction(); //2. Insertion des éléments for (RoomPersonWithAnimals personAnimals : personsWithAnimals) { myRoomDatabase.roomPersonDao().insert(personAnimals.person); myRoomDatabase.roomCatDao().insertAll(personWithAnimals.cats.toArray(newRoomCat[personWithAnimals.cats.size()]); myRoomDatabase.roomDogDao().insertAll(personWithAnimals.dogs.toArray(newRoomDog[personWithAnimals.dogs.size()])); for (RoomCat cat : personWithAnimals.cats) { myRoomDatabase.roomPersonCatDao().insert(new RoomPersonCat(personWithAnimals.person.id, cat.id)); } for (RoomDog dog : personWithAnimals.dogs){ myRoomDatabase.roomPersonDogDao().insert(new RoomPersonDog(personWithAnimals.person.id, dog.id)); } } //3. On termine la transaction myRoomDatabase.setTransactionSuccessful(); myRoomDatabase.endTransaction();
  • 42. 2017 42 Bilan provisoire 3. Les requêtes • Rude... • Par défaut impossibilité de faire des requêtes dans le thread de l’UI • SQL
  • 44. 2017 44 Smart&Soft Agence Digitale 3. Les performances Room Realm Insertion de beaucoup de données 10 991 ms 2 587 ms Insertion d’une ligne 6 ms 4 ms Sélection 3 ms 26 ms Suppression 7 ms 15 ms Mise à jour 4 ms 4 ms
  • 45. 2017 45 Realm 4. Gestion de la migration • Possibilité de détruire la base de données existante • Possibilité de gérer une migration via l’interface RealmMigration • Migration orientée objet
  • 46. 2017 46 Room 4. Gestion de la migration • Possibilité de gérer plusieurs migrations via la classe Migration • Migration orientée SQL • Possibilité de faire des tests unitaires sur la migration d’une base de données • Possibilité d’exporter le schéma de base de données au format JSON
  • 47. 2017 47 Smart&Soft Agence Digitale 5. Autres éléments de comparaison Room Realm Données “observables” RxJava 2 LiveData RxJava 1 jusqu’à Realm 3.x RxJava 2 depuis Realm 4 Méthodes 486 2468 Classes / Interfaces générées 6 8 Poids négligeable ~ 14 MB
  • 49. Smart&Soft Agence Digitale 2017 49 Liens utiles • https://realm.io/docs/java/latest/ • https://developer.android.com/topic/libraries/architecture/room.h tml
  • 51. 92 rue Réaumur - 75 002 - Paris contact@smartnsoft.com www.smartnsoft.com 01 42 12 28 41