web-dev-qa-db-ja.com

Roomでの1対多の関係

私は過去のほとんどのプロジェクトでSugarDBを使用しています。使いやすく、私の要件のほとんどを満たしていましたが、そのプロジェクトが中止されたため、代替案を検討することにしました。部屋は最良の選択肢のようです。

ただし、Roomでは、いくつかの基本的なことがかなり混乱しています。私のオブジェクトは、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のリストと一緒にデータベースに保存されますか?

10
Asim

この方法でできると思います。

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

これは自動的に内部で参照されるクラスもエンティティとして扱いますか?

いいえ。実際、コードのコンパイルに失敗すると思います。次のことを行う必要があります。

  • Book@Entityにする
  • issuedBooksTestModelから削除します
  • BookTestModelの間に@ForeignKey関係を設定する

TestModelのオブジェクトを保存すると、Booksのリストと一緒にデータベースに保存されますか?

番号。

部屋はORMではありません。 RoomはSQLiteの薄いオブジェクトラッパーです。 @Entityおよび@ForeignKeyは、テーブル構造をモデル化します。 IMHO、RoomをデータベースのDTOであると考える最も簡単な方法。オブジェクトグラフを表すモデルオブジェクトはエンティティではなく、エンティティから構築されます。これは、Webサービス(Retrofitなど)からサーバーへの応答がどのようにDTOであるかに似ており、これらのオブジェクトから、アプリで使用する「実際の」モデルオブジェクトにマップする必要がある場合があります。

9
CommonsWare