在Android上使用OrmLite保存从Jackson创建的对象的子集合



我有一个REST服务,我从我的应用程序调用,它拉入一个JSON对象作为byte[],然后变成一个很好的嵌套的对象集合——所有这些都工作得很好。然后我想做的是使用OrmLite将这些对象持久化到SQLite存储中,这就是事情开始崩溃的地方,因为据我所知,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对象时,子对象不与父对象一起持久化。

这是一个常见的问题,以前已经提出过,肯定有其他的问题,这是非常类似的一个,最值得注意的是保存嵌套的外部对象与ORMLite在Android上的回答,Gray建议创建父对象之前的子对象,这将很好地创建我的pojo手动。

然而,我还没有看到一个答案,在对象是由另一个库(在本例中是Jackson)生成的情况下,哪些因素会起作用。如果不深入挖掘Jackson的反序列化内部(这会消除其简单性的全部好处),并试图让Jackson创建子对象,然后将它们添加到父对象(除非我遗漏了什么,这比听起来容易?),在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案。

同样,还有其他解决方案,包括向外键添加进一步的注释,这些注释似乎适用于处理单个子对象,但这些注释在使用@ForeignCollectionField s及其相应的Collection s时不可用。

你可以尝试在父类中使用ForeignCollection而不是Collection。

来自ormlife - 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添加(T))

我从来没有处理过这个,虽然,所以我只是希望文档是正确的,这有助于你解决你的问题。: -)

最新更新