6 votes

Relation un-à-plusieurs dans la salle

J'ai utilisé SugarDB pour la plupart de mes projets dans le passé. Il était facile à utiliser et répondait à la plupart de mes besoins, mais comme ce projet a été abandonné, j'ai décidé de chercher des alternatives et Room semble être la meilleure option.

Cependant, certaines choses fondamentales sont assez confuses en salle. Mon objet utilise Gson pour remplir des données à partir d'un webservice, et en tant que tel, des liens vers d'autres objets. A titre d'exemple, considérons les classes ci-dessous :

@Entity
public class TestModel
{
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String name;
    private String age;
    private List<Book> issuedBooks;
}

public class Book
{
    private String title;
    private int ISBN;
}

Maintenant, si ma première classe est annotée en tant qu'entité, cela traitera-t-il automatiquement les classes référencées à l'intérieur de celle-ci comme des entités également ?

Si je sauvegarde un objet de TestModel, la liste des Livres qu'il contient sera-t-elle sauvegardée dans la base de données ?

11voto

Cheok Yan Cheng Points 11825

Je suppose que vous pouvez le faire de cette façon.

@Entity
public class TestModel {
    @PrimaryKey
    public int id;          // TestModel id
    public String name;
    public String age;
}

@Entity
public class Book {
    @PrimaryKey
    public int id;          // Book id
    public int testModelId; // TestModel id
    public String title;
    public int ISBN;
}

public class TestModelWithBooks {
   @Embedded
   public TestModel testModel;

   @Relation(parentColumn = "id", entityColumn = "testModelId", entity = Book.class)
   public List<Book> books;
}

Pour leur Dao vous pouvez l'écrire de cette façon.

@Dao
public interface TestModelDao {
    @Query("SELECT * FROM TestModel")
    public List<TestModelWithBooks> loadTestModelsWithBooks();
}

6voto

CommonsWare Points 402670

Est-ce que cela traitera automatiquement les classes référencées à l'intérieur comme des entités ?

Non. En fait, je m'attendrais à ce que votre code ne compile pas. Vous auriez besoin de :

  • Faire Book être un @Entity
  • Retirer issuedBooks de TestModel
  • Mettre en place un @ForeignKey relation entre Book y TestModel

Si je sauvegarde un objet de TestModel, la liste des Livres qu'il contient sera-t-elle sauvegardée dans la base de données ?

Non.

Room n'est pas un ORM. Room est une enveloppe fine d'objets autour de SQLite. @Entity y @ForeignKey modéliser la structure de la table. À mon avis, la façon la plus simple d'envisager la salle est de la considérer comme des DTO de la base de données. Vos objets de modèle qui représentent votre graphe d'objets ne sont pas les entités, mais sont construits à partir des entités. Cela ressemble à la façon dont les réponses d'un service Web (par exemple, Retrofit) sont des DTO vers le serveur, et vous pouvez avoir besoin de faire correspondre ces objets aux "vrais" objets de modèle que vous voulez utiliser dans l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X