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?
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();
}
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:
Book
un @Entity
issuedBooks
de TestModel
@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.