使用 Android 上的 OrmLite 保存子集合,其中包含从 Jackson 创建的对象

2022-08-31 19:39:43

我有一个REST服务,我从我的应用程序调用它,它拉入一个JSON对象作为一个,然后变成一个很好的嵌套对象集合 - 所有这些位都工作正常。然后我想做的是使用OrmLite将这些对象持久保存到SQLite存储中,这就是事情开始崩溃的地方,因为据我所知,OrmLite不会自动持久化嵌套对象。byte[]

为简单起见,让我们剥离我的实际功能,让我的对象按如下方式建模:

@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 */
}

发生的情况是,当在数据库中添加具有相应对象的新对象时,子对象不会与父对象一起持久化。ParentparentDao

这是一个常见的问题,之前已经提出过,SO上肯定还有其他问题与此非常相似,最值得注意的是在Android上使用ORMLite保存嵌套的异物,作为答案,Gray建议在父对象之前创建子对象,这对于手动创建我的POJO来说很好。

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

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


答案 1

您可能希望尝试在父类中使用外语集合而不是集合。

来自 ORMLite 文档:

“外部集合支持 add() 和 remove() 方法,在这种情况下,如果集合是 eager 的,则将从内部列表中添加或删除对象,并且 DAO 调用将影响 [子] 表以及 eager 和 lazy 集合。

(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))

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


答案 2

推荐