Сохранение дочерних коллекций с помощью OrmLite на Android с объектами, созданными из Jackson
У меня есть служба REST, которую я вызываю из своего приложения, которое тянет объект JSON как byte[]
, который затем превращается в красивую вложенную коллекцию объектов - все это бит отлично работает. То, что я тогда хочу сделать, это сохранить эти объекты в хранилище SQLite с помощью OrmLite и что там, где все начинает разрушаться, поскольку, как я понимаю, OrmLite не сохраняет автоматически вложенные объекты.
Для простоты, разрешите мою фактическую функциональность и пусть мои объекты будут смоделированы просто так:
@DatabaseTable(tableName = "parents")
public class Parent {
@DatabaseField(id=true)
private String name;
@ForeignCollectionField
// have to use Collection here because needs to be compatible with Jackson
private Collection<Child> children;
/* Getters and setters go here */
}
@DatabaseTable(tableName = "children")
public class Child {
@DatabaseField(id=true)
private String name;
@DatabaseField(foreign=true)
private Parent parent;
/* Getters and setters go here */
}
Что происходит при добавлении создания нового объекта Parent
в базу данных с моим соответствующим объектом parentDao
, дети не сохраняются вместе с родителем.
Это распространенный вопрос, который был поднят до этого, есть некоторые другие вопросы по SO, которые очень похожи на этот, особенно "Сохранение вложенных посторонних объектов с ORMLite на Android" в ответ на то, что Грей предлагает создать дочерний объект перед родителем, который будет отлично работать для создания моих POJO вручную.
Тем не менее, я еще не видел ответа, какие факторы в случаях, когда объекты генерируются другой библиотекой (в данном случае Jackson). Не углубляясь в глубину Джексонской десериализации (которая устраняет все преимущества своей простоты) и пытается заставить Джексона создать дочерние объекты, а затем добавить их к родителям (если я не пропущу что-то, и это проще, чем кажется)? это не кажется особенно привлекательным решением в данном конкретном случае.
Кроме того, существуют другие решения, которые включают добавление дополнительных аннотаций к внешнему ключу, которые, по-видимому, подходят для работы с одиночными дочерними объектами, но эти аннотации недоступны при работе с @ForeignCollectionField
и их соответствующими Collection
s.
Ответы
Ответ 1
Возможно, вы захотите попробовать использовать ForeignCollection вместо Collection в своем родительском классе.
Из документа ORMLite-Documentation:
"Иностранные коллекции поддерживают методы add() и remove(), и в этом случае объекты будут добавлены или удалены из внутреннего списка, если коллекция будет нетерпеливо, и вызовы DAO будут направлены на [дочерние] таблицу как для жадных, так и для ленивых коллекций".
(http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection)
В документации к самому классу также указано, что добавление/удаление пересылается в базу данных. (http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/dao/ForeignCollection.html#add(T))
Я никогда не работал с этим, поэтому я просто надеюсь, что документация верна, и это поможет вам решить вашу проблему.: -)