室内一对多关系

时间:2018-01-25 13:15:56

标签: android android-sqlite android-room

我过去一直在为大多数项目使用SugarDB。它很容易使用并且满足了我的大部分要求,但由于该项目已被放弃,因此决定考虑替代方案,而房间似乎是最佳选择。

然而,一些基本的东西在房间里很混乱。 My Object使用Gson填充来自Web服务的数据,例如链接到其他对象。例如,请考虑以下类:

@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;
}

现在,如果我的第一个类被注释为实体,那么它会自动将其中引用的类视为实体吗?

如果保存TestModel的对象,是否会将包含它的Books列表保存到数据库中?

2 个答案:

答案 0 :(得分:9)

我想你可以这样做。

@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;
}

对于他们的Dao,你可以这样写。

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

答案 1 :(得分:5)

  

这会自动将其中引用的类视为实体吗?

没有。实际上,我希望你的代码无法编译。你需要:

  • Book设为@Entity
  • issuedBooks
  • 移除TestModel
  • @ForeignKeyBook
  • 之间设置TestModel关系
  

如果保存TestModel的对象,是否会将包含它的Books列表保存到数据库中?

没有

房间不是ORM。 Room是一个围绕SQLite的瘦对象包装器。 @Entity@ForeignKey为表格结构建模。恕我直言,最简单的方式是将Room视为数据库的DTO。表示对象图的模型对象不是实体,而是从实体构建。这类似于Web服务(例如,Retrofit)对服务器的响应的响应,您可能需要将这些对象映射到要在应用程序中使用的“真实”模型对象。