私は過去のほとんどのプロジェクトで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のリストと一緒にデータベースに保存されますか?
この方法でできると思います。
@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();
}
これは自動的に内部で参照されるクラスもエンティティとして扱いますか?
いいえ。実際、コードのコンパイルに失敗すると思います。次のことを行う必要があります。
Book
を@Entity
にするissuedBooks
をTestModel
から削除しますBook
とTestModel
の間に@ForeignKey
関係を設定するTestModelのオブジェクトを保存すると、Booksのリストと一緒にデータベースに保存されますか?
番号。
部屋はORMではありません。 RoomはSQLiteの薄いオブジェクトラッパーです。 @Entity
および@ForeignKey
は、テーブル構造をモデル化します。 IMHO、RoomをデータベースのDTOであると考える最も簡単な方法。オブジェクトグラフを表すモデルオブジェクトはエンティティではなく、エンティティから構築されます。これは、Webサービス(Retrofitなど)からサーバーへの応答がどのようにDTOであるかに似ており、これらのオブジェクトから、アプリで使用する「実際の」モデルオブジェクトにマップする必要がある場合があります。