1 pièce(s) jointe(s)
Android Room Persistence Library : Meilleure façon de modéliser une relation "many to many" ?
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" :
Pièce jointe 298962
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 :
Code:
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é Cat :
Code:
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;
} |
L'entité permettant de modéliser la relation "many to many" :
Code:
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;
}
} |
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:
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;
} |
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 !
- 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 :
Code:
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));
}
} |
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 ?
Merci d'avance pour votre aide et vos conseils !