Я разработал модель с двумя объектами: ParentEntity
и ChildEntity
. Я использую OrmLite для хранения их в базе данных.
На самом деле я получаю свои данные из удаленного веб-сервиса. Это процесс, который у меня есть:
- Запрос веб-сервиса (с использованием модификации)
- Получить строку JSON в ответ
- Строка JSON анализируется Gson в модель JSON (еще раз спасибо за модификацию :))
- Я конвертирую модель JSON в модель OrmLite (библиотеки нет, делаю сам)
- Модель OrmLite возвращается к обратному вызову в ожидании ответа на запрос.
- Обратный вызов отвечает за вызов DAO для фактического сохранения данных.
Этот процесс отлично работает для простых объектов. Но проблема возникает, когда я пытаюсь управлять более сложными объектами, например, с ForeignCollection
. На самом деле я не могу выполнить шаг 4, потому что не могу создать новый ForeignCollection
, чтобы поместить в него свои дочерние объекты.
Я нашел несколько ответов, в которых говорилось, что я должен хранить каждого ребенка самостоятельно, но это нарушит шаг 6 моего рабочего процесса.
Итак, вопрос:
Как я могу инициализировать ForeignCollection
перед получением объекта из базы данных?
Я мог бы найти способ изменить рабочий процесс. Но это всего лишь своего рода «обходной путь», и для этого будут созданы объекты-контейнеры...
Схема OrmLite (упрощенная)
(У класса Entity
есть только свойство id
и его геттер/сеттер.)
Родительский объект
@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);
}
}
Дочерняя сущность
@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
}