1対多
ここではすべてが簡単です。ドキュメントには、エンティティ間の1対多の関係を得るためにクラスを編成する方法が記載されています。 2つのエンティティを取得します。
@Entity public class DialogPojo { @NonNull @PrimaryKey String id; //other fields } @Entity( foreignKeys = @ForeignKey(entity = DialogPojo.class, parentColumns = "id", childColumns = "dialogId", onDelete = ForeignKey.CASCADE), primaryKeys = {"dialogId", "tag"}) public class TagPojo { @NonNull String dialogId; @NonNull String tag; //other fields }
そしてそれらを単一のエンティティにバインドします:
public class DialogWithTags { @Embedded public DialogPojo dialog; @Relation(parentColumn = "id", entity = TagPojo.class, entityColumn = "dialogId") public List<TagPojo> tags; //other fields }
DialogWithTagsタイプの新しいエンティティを取得するには、Daoを使用する必要があります。DaoはDialogPojoテーブルからデータをロードし、リンクテーブル(entity = TagPojo.class)からタグを自動的にロードします。
@Dao public interface DialogDao { @Query("SELECT * FROM DialogPojo WHERE id = :dialogId") LiveData<DialogWithTags> loadDialogBy(String dialogId); @Query("SELECT * FROM DialogPojo WHERE id = :dialogId") DialogWithTags getDialogBy(String dialogId); }
この知識を使用すると、すでに
誠実さ
奇妙なことに、DialogWithTagsのリクエストはデータの整合性を保証しません。 つまり、DialogPojoはすでにロードされているが、TagPojoリストはロードされていない可能性があります。 プログラムのコンパイルの段階で、起こりうる問題に関する警告が表示されます。
@Dao public interface DialogDao { @Transaction @Query("SELECT * FROM DialogPojo WHERE id = :dialogId") LiveData<DialogWithTags> loadDialogBy(String dialogId); @Transaction @Query("SELECT * FROM DialogPojo WHERE id = :dialogId") DialogWithTags getDialogBy(String dialogId); }
保存中
残念ながら、DialogWithTagsモデルの保存は機能しません。 たとえば、次のように、データを個別に、できれば1つのトランザクションで保存する必要があります。
@Dao public abstract class DialogDao { @Transaction public void insert(DialogWithTags dialogWithTags) { insert(dialogWithTags.dialog); for(TagPojo tag: dialogWithTags.tags) { insert(tag); } } @Insert(onConflict = OnConflictStrategy.IGNORE) public abstract long insert(DialogPojo dialog); @Insert(onConflict = OnConflictStrategy.IGNORE) public abstract long insert(TagPojo tag); .... }
ライブデータ
LiveDataを使用する場合、最大の失望が待っています。 データは、[埋め込み]ダイアログフィールドに対してのみ有効になります。 タグへの変更は追跡されません。 もちろん、タグフィールドをLiveDataとして宣言できますが、LiveDataは少なくとも1つのオブザーバーが登録されている場合にのみデータを返すことを忘れないでください。
おわりに
他のフレームワークと同様に、アーキテクチャコンポーネントは多くの問題を解決し、開発者を定型コードから救い