と の 2 つのエンティティを持つモデルを設計しましParentEntity
たChildEntity
。OrmLite を使用してデータベースに保存します。
私は実際にリモート Web サービスからデータを取得します。これは私が持っているプロセスです:
- Web サービスをリクエストする (レトロフィットを使用)
- 応答で JSON 文字列を取得する
- JSON 文字列は Gson によって JSON モデルに解析されます (レトロフィットに感謝します :))
- JSONモデルをOrmLiteモデルに変換します(ライブラリなし、自作)
- OrmLite モデルは、リクエストの応答を待っているコールバックに返されます
- コールバックは、DAO を呼び出して実際にデータを保存する役割を担います。
このプロセスは、単純なエンティティに対して完全に機能します。ForeignCollection
しかし、たとえば、より複雑なエンティティを管理しようとすると問題が発生します。実際、子エンティティを内部に配置するための新しいエンティティを作成できないため、手順 4を達成できません。ForeignCollection
すべての子を自分で保存する必要があるという回答がいくつか見つかりましたが、ワークフローのステップ 6 が中断されます。
質問は次のとおりです。
ForeignCollection
データベースからオブジェクトを取得する前にどのように初期化できますか?
ワークフローを変更する方法を見つけることができました。しかし、これは一種の「回避策」にすぎず、これを実現するためだけにコンテナ オブジェクトを作成します...
OrmLite スキーマ (簡略化)
(クラスEntity
には、プロパティid
とそのゲッター/セッターしかありません。)
ParentEntity
@DatabaseTable(daoClass = ParentEntityDao.class)
public class ParentEntity extends Entity
{
@ForeignCollectionField(eager = true)
private ForeignCollection<TimesheetEntry> entries;
public Collection<TimesheetEntry> getEntries()
{
if(entries != null)
{
return Collections.unmodifiableCollection(entries);
}
else
{
return Collections.unmodifiableCollection(new ArrayList<TimesheetEntry>());
}
}
public void addEntry(ChildEntry childEntry)
{
childEntry.setParent(this);
entries.add(childEntry);
}
public void removeEntry(ChildEntry childEntry)
{
entries.remove(childEntry);
}
}
ChildEntity
@DatabaseTable(daoClass = ChildEntityDao.class)
public class ChildEntry extends Entity
{
@DatabaseField(foreign = true, canBeNull = false)
private ParentEntity parentEntity;
public void setParentEntity(ParentEntity parentEntity)
{
this.parentEntity = parentEntity;
}
public ParentEntity getParentEntity()
{
return parentEntity;
}
}
JSON スキーマ (簡略化)
親会社
public class JsonParentEntity
{
private List<JsonChildEntity> entries;
// Getter/setter
}
子エンティティ
public class JsonChildEntity
{
private String name;
// Getter/setter
}