Bonjour,
J'ai pour habitude d'utiliser Realm et je suis actuellement en train de tester Room afin de voir si ça vaut le coup de l'adopter (quand on connait certaines limitations de Realm).
Dans le cadre de mon test, je souhaite modéliser une relation de type "many to many" :
En terme de Java (et Realm) la manipulation du POJO serait une Person qui tient une liste de Cat.
Pour la modélisation avec Room ça semble tout de suite plus compliqué. Voici mes entités.
Tout d'abord l'entité Person :
L'entité Cat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @Entity(tableName = "person") public final class RoomPerson { @PrimaryKey public int id; public String name; }
L'entité permettant de modéliser la relation "many to many" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Entity(tableName = "cat") public final class RoomCat { @PrimaryKey public int id; public int age; public String name; }
Finalement, j'ai également créé un POJO qui permet justement de modéliser l'utilisation que je souhaite avoir de mon modèle dans l'application :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 @Entity(tableName = "person_cat", primaryKeys = { "personId", "catId" }, indices = { @Index(value = { "catId" }) }, foreignKeys = { @ForeignKey(entity = RoomPerson.class, parentColumns = "id", childColumns = "personId"), @ForeignKey(entity = RoomCat.class, parentColumns = "id", childColumns = "catId") }) public final class RoomPersonCat { public int personId; public int catId; public RoomPersonCat(int personId, int catId) { this.personId = personId; this.catId = catId; } }
Maintenant, dans mon application, imaginons que je souhaite persister une liste de RoomPersonWithAnimals. Dans Realm c'est très simple. Une ligne de code. Par contre dans Room j'ai l'impression que je suis obligé de passer par 3 requêtes !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public final class RoomPersonWithAnimals { @Embedded public RoomPerson person; @Relation(parentColumn = "id", entityColumn = "id", entity = RoomCat.class) public List<RoomCat> cats; }
- une requête pour sauvegarder la personne dans la table person
- une requête pour sauvegarder le chat dans la table cat
- une requête dans la table person_cat pour sauvegarder la relation many to many
Finalement, en code Java, ça se traduit par les boucles suivantes :
La question que me pose est : est-ce que mon code est bon ? Ça me semble suspect de devoir faire autant de requête pour sauvegarder ma liste. Mais peut-être suis-je simplement influencé par Realm ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 for (RoomPersonWithAnimals personWithAnimals : persons) { myRoomDatabase.roomPersonDao().insert(personWithAnimals.person); myRoomDatabase.roomCatDao().insertAll(personWithAnimals.cats.toArray(new RoomCat[personWithAnimals.cats.size()])); for (RoomCat cat : personWithAnimals.cats) { myRoomDatabase.roomPersonCatDao().insert(new RoomPersonCat(personWithAnimals.person.id, cat.id)); } }
Merci d'avance pour votre aide et vos conseils !
Partager