1. #1
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2011
    Messages : 126
    Points : 85
    Points
    85

    Par défaut 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" :

    Nom : GEsfC.png
Affichages : 43
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 !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2011
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2011
    Messages : 126
    Points : 85
    Points
    85

    Par défaut

    Je me permets de faire remonter un peu mon sujet si jamais certains ont utilisé la bibliothèque depuis

Discussions similaires

  1. [2.x] Meilleure façon de modéliser ce problème
    Par ptitcodeur dans le forum Symfony
    Réponses: 5
    Dernier message: 29/05/2013, 21h13
  2. Réponses: 5
    Dernier message: 22/07/2008, 09h06
  3. La meilleure façon d'appeler une page
    Par The eye dans le forum VB.NET
    Réponses: 1
    Dernier message: 26/01/2008, 12h10
  4. Réponses: 3
    Dernier message: 09/05/2006, 15h16
  5. Réponses: 7
    Dernier message: 24/02/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo