室内一对多关系

Asi*_*sim 7 android android-sqlite android-room

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

然而,一些基本的东西在Room中相当混乱.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;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我保存TestModel的对象,它会将带有它的Books列表保存到数据库中吗?

Che*_*eng 11

我想你可以这样做.

@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;
}
Run Code Online (Sandbox Code Playgroud)

对于他们来说Dao,你可以这样写.

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

  • 你怎么插入? (8认同)
  • 当我有几个级别时可以扩展这个解决方案,例如我有类人,人有信用卡列表,每张信用卡都有银行列表,银行有地址,地址有坐标,坐标由纬度和经度组成。我应该通过外键使用简单的一对多方法,还是您的方法也可以? (2认同)

Com*_*are 7

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

不会。事实上,我希望您的代码无法编译。您需要:

  • 制作Book是一个@Entity
  • issuedBooks从中删除TestModel
  • 建立了@ForeignKey关系之间BookTestModel

如果我保存TestModel的对象,它会将书籍列表与它一起保存到数据库吗?

没有。

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