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

我有一个REST服务,我正在从我的应用程序调用,它将一个JSON对象作为byte[]引入,然后将其转换为一个漂亮的嵌套对象集合 – 所有这些都可以正常工作。 我当时想要做的是使用OrmLite将这些对象持久化到SQLite存储,这就是事情开始崩溃的地方,因为据我所知,OrmLite不会自动持久化嵌套对象。

为简单起见,让我们删除我的实际function,并让我的对象简单地建模如下:

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

会发生的情况是,在使用相应的parentDao对象添加在数据库中创建新的Parent对象时,子节点不会与父节点一起parentDao

这是一个常见的问题并且之前已经提出过,在SO上肯定还有其他问题与这个非常相似,最值得注意的是在Android上用ORMLite保存嵌套的外来对象,以回答Gray建议在父对象之前创建子对象的问题。可以正常工作创建我的POJO。

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

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

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

来自ORMLite文档:

“外部集合支持add()和remove()方法,在这种情况下,如果集合是急切的话,对象将被添加到内部列表中或从内部列表中删除,并且DAO调用也会影响[child]表。对于渴望和懒惰的collections品。“

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)

我从来没有使用过这个,所以我希望文档是正确的,这有助于你解决问题。 🙂