Android : Realm VS SQLite

Un petit trajet en métro? Un voyage en avion? Un séjour à la campagne?Aujourd’hui, malgré le développement du réseau 4G, il y a toujours des moments où l’on se retrouve perdu, face à notre smartphone et toutes ses applications inutiles sans Internet. Enfin presque… Depuis quelques années, de nombreuses applications proposent leur propre mode Hors-Ligne, qui permet à l’utilisateur de retrouver certains contenus, même sans connexion. C’est le cas de Deezer et Spotify par exemple, qui permettent d’accéder à certaines musiques où que l’on soit.

D’ailleurs, dernièrement chez Geoks, nous avons travaillé sur Divercities, une application dans le même genre, où l’utilisateur a, entre autre, la possibilité de télécharger des musiques et des vidéos sur son téléphone, lui permettant ainsi de les retrouver quelle que soit la qualité de sa connexion Internet. Dans un tout autre registre, nous avons également développé une application de partage d’événements. L’idée était de partir du même principe que Facebook : les événements consultés sont sauvegardés au fur et à mesure sur le téléphone. Ainsi, lorsque l’utilisateur perd la connexion Internet, il a quand même accès aux événements qu’il a déjà vu.

Pour retrouver ces informations, il est nécessaire de les stocker sur le téléphone dans une base de données, accessible uniquement par l’application en question. Sur Android, c’est SQLite qui a longtemps été le système de gestion de base de données recommandé, puisqu’il fait partie du SDK Android et qu’il peut être utilisé directement dans notre application, sans librairie supplémentaire. Le seul souci, c’est qu’on doit quand même écrire à la main la création des tables et les requêtes vers la base, faute de mapper…

Mais depuis quelques temps, un petit nouveau se fait connaître et mérite toute notre attention : Realm. Sortie en 2014, c’est une base de données, orientée objet, conçue spécialement pour les mobiles. Bibliothèque opensource, elle est en continuelle évolution : ses défauts sont donc corrigés au fur et à mesure et au bout de trois ans, il y a eu pas mal de modifications. Chouette non ? Sur Android, c’est le pied ! Notre base de données est définie avec les objets dont nous avons besoin. Exemple pour récupérer une liste de livres, écrit par J.K.Rowling et dont le titre commence par ‘H’ :

Realm realm = Realm.getDefaultInstance();
RealmResults<Livre> livres = realm.where(Livre.class)
.equalTo(“auteur”, “J.K.Rowling”)
.beginsWith(“titre”, “H”)
.findAll();

Alors qu’avec SQLite, ça donne :

SQLiteDatabase db = this.getReadableDatabase();
ArrayList<Livre> livres = new ArrayList<>();
Livre livre;
Cursor cursor = db.query(LIVRE_TABLE, null, “auteur=? AND titre LIKE ?”, new String[] {“J.K.Rowling”, “H%”}, null, null, null, null);
if (cursor != null && cursor.getCount() != 0) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
livre = new Livre();
// remplir tous les paramètres de l’objet livre
livres.add(livre);
cursor.moveToNext();
}
cursor.close();

C’est plus compréhensible non? Et encore, là nous n’avons pas décrit le mapper, qui permet de remplir pour chaque livre ses paramètres… Et pour enregistrer un livre dans la base de données, qu’est ce que ça donne ?

Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealmOrUpdate(livre);

Alors qu’avec SQLite :

ContentValues values = new ContentValues();
values.put(LIVRE_ID, livre.getId());
values.put(LIVRE_TITRE, livre.getTitre());
values.put(LIVRE_AUTEUR, livre.getAuteur());
SQLiteDatabase db = this.getWritableDatabase();
db.insert(LIVRE_TABLE, null, values);
db.close();

Un autre point que nous pouvons également aborder est la migration de la base de données : au cours d’un projet, notre base de données est amenée à changer de structure. L’objet Livre peut par exemple être modifié pour prendre un nouveau paramètre “titre_secondaire”, alors que le paramètre “titre” devient “titre_principal”. Il faudrait alors que toutes les valeurs enregistrées dans la colonne “titre”, se retrouvent dans la colonne “titre_principal” et qu’une nouvelle colonne “titre_secondaire” soit créée. Avec SQLite, une telle manipulation est compliquée. Il faut en réalité quatre étapes :

  • construire une nouvelle table,
  • copier les valeurs de la première table dans la nouvelle,
  • supprimer la première table
  • renommer la nouvelle table.

En revanche, avec Realm, tout est pris en charge. On définit ce qui change dans un objet RealmMigration, qui est appelé lorsque la version de la base change, et c’est réglé :

RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(2)
.migration(migration)
.build();
RealmMigration migration = new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
schema.get(“Livre”)
.renameField(“titre”, “titre_principal”)
.addField(“titre_secondaire”, String.class, null);
}
};

Si on regarde maintenant les performances, on remarque que Realm se démarque par sa rapidité d’exécution : près de 51 requêtes et 20 000 insertions par seconde pour Realm contre 7 requêtes et 9000 insertions par seconde pour SQLite. Impressionnant !

Cependant, Realm reste une librairie : au premier abord, tout à l’air très simple et permet de gagner du temps, mais le jour où l’on aura besoin d’une requête très spécifique, ou même de requêtes combinées, il faudra peut être plonger un peu plus dans la documentation pour voir si ce cas a été géré et s’il est possible de réaliser cette requête… De plus, bien que Realm soit mis à jour régulièrement, il reste quand même un gros point noir à améliorer : on ne peut pas auto-incrémenter les ids, donc si un objet n’a pas d’id, il prendra par défaut la valeur 0…


Visuellement, il n’y a donc pas photo : Realm permet rapidement de faire les transactions voulues. Bien que SQLite se rapproche de l’utilisation classique des bases de données en informatique et donc facile à prendre en main pour une personne qui a déjà fait du traitement de données, Realm assure un code propre et compréhensible à tous et ce, en quelques lignes seulement. Pour le moment, chez Geoks, nous nous étions contentés de SQLite, qui répondait très bien à nos critères. Mais Realm commence à faire ses preuves et je pense qu’il est vraiment bien adapté aux mobiles. Il peut faire gagner du temps pour les bases de données avec des objets simples. En quelques minutes, on peut construire une table et y insérer des objets ! Alors oui, Realm a encore du chemin à faire pour nous convaincre totalement, mais il se peut bien que nos prochaines applications utilisent cette nouvelle base de données !

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade