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" :

Nom : GEsfC.png
Affichages : 20
Taille : 7,3 Ko

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 : 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é Cat :

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;
 
}
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
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 : 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;
 
}
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 : 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));
  }
}
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 !