web-dev-qa-db-fra.com

Relation un à plusieurs dans la salle

J'ai utilisé SugarDB pour la plupart de mes projets dans le passé. Il était facile à utiliser et satisfaisait la plupart de mes exigences, 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 de base sont assez déroutantes dans Room. Mon objet utilise Gson pour remplir des données à partir d'un service Web, et en tant que tels, des liens vers d'autres objets. À titre d'exemple, considérez 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 comme des entités?

Si j'enregistre un objet de TestModel, est-ce qu'il enregistrera la liste des livres avec lui dans la base de données?

10
Asim

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();
}
15
Cheok Yan Cheng

cela traitera-t-il 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 parvienne pas à se compiler. Vous devrez:

  • Faites de Book un @Entity
  • Supprimer issuedBooks de TestModel
  • Mettre en place un @ForeignKey relation entre Book et TestModel

Si j'enregistre un objet de TestModel, est-ce qu'il enregistrera la liste des livres avec lui dans la base de données?

Non.

La chambre n'est pas un ORM. Room est une enveloppe d'objet mince autour de SQLite. @Entity et @ForeignKey modélise la structure de la table. À mon humble avis, la façon la plus simple de voir Room comme des DTO de la base de données. Vos objets de modèle qui représentent votre graphique d'objet ne sont pas les entités, mais sont plutôt construits à partir des entités. Cela s'apparente à la façon dont les réponses d'un service Web (par exemple, Retrofit) sont des DTO au serveur, et vous devrez peut-être mapper de ces objets aux objets de modèle "réels" que vous souhaitez utiliser dans l'application.

9
CommonsWare