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

时间:2013-06-21 00:03:39

标签: java android orm jackson ormlite

我有一个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对象时,会发生这些情况,并且子节点不会与父节点一起保留。

这是一个常见的问题并且之前已经提出过,在SO上肯定还有其他问题与这个问题非常相似,最值得注意的是Saving nested foreign objects with ORMLite on Android,而Gray建议在父母之前创建子对象。可以手动创建我的POJO。

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

同样,还有其他解决方案涉及向外键添加更多注释,这些注释似乎适合处理单个子对象,但在使用@ForeignCollectionField及其相应的{Collection时,这些注释不可用。 {1}}秒。

1 个答案:

答案 0 :(得分:0)

您可能想尝试在父类中使用ForeignCollection而不是Collection。

来自ORMLite-Documentation:

&#34;外部集合支持add()和remove()方法,在这种情况下,如果集合是急切的话,将从内部列表中添加或删除对象,并且将使DAO调用影响[儿童]表也适用于渴望和懒惰的收藏品。&#34;

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)

我从未使用过这个,所以我希望文档是正确的,这有助于您解决问题。 : - )