Подтвердить что ты не робот

Сохранение дочерних коллекций с помощью 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.

4b9b3361

Ответ 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))

Я никогда не работал с этим, поэтому я просто надеюсь, что документация верна, и это поможет вам решить вашу проблему.: -)