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

标签 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 )生成的情况下会影响哪些因素的答案。没有深入挖掘 jackson 的反序列化内部(这消除了其简单性的全部好处)并试图让 jackson 创建子对象,然后将它们添加到父对象(除非我错过了一些东西,这比听起来容易吗?)在这种特殊情况下,这似乎不是一个特别有吸引力的解决方案。

同样,还有其他解决方案涉及向外键添加更多注释,这些注释似乎适合处理单个子对象,但在处理 @ForeignCollectionFields 时这些注释不可用及其对应的Collections.

最佳答案

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

来自 ORMLite 文档:

"外部集合支持 add() 和 remove() 方法,在这种情况下,如果集合是 Eager 的,对象将被添加或从内部列表中删除,并且将进行 DAO 调用以影响 [child]表也​​适用于急切和懒惰的集合。”

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

不过,我从来没有使用过这个,所以我只希望文档是正确的,这可以帮助您解决问题。 :-)

关于java - 使用从 Jackson 创建的对象在 Android 上使用 OrmLite 保存子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225792/

相关文章:

c# - ORM 是用于迁移数据的正确工具吗?

Android GreenDao - 仅删除特定实体的缓存对象

php - 什么是 ORM? Eloquent ORM?

java - 了解接口(interface)当前类路径中是否有实现类

Java——套接字编程

android - 在 Android 中通过 URI 传递参数

android - Flutter 1.9:D/skia(5106):着色器编译错误

android - Android 模拟器命令变体之间的差异

java - 如果所请求的 key 不存在,应该抛出什么异常?

java - 以编程方式启动 axis2 服务