最是人间留不住,朱颜辞镜花辞树。这篇文章主要讲述使用从Jackson创建的对象在Android上使用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
s及其相应的Collection
s时,这些注释不可用。答案您可能想尝试在父类中使用ForeignCollection而不是Collection。
来自ORMLite文档:
“外部集合支持add()和remove()方法,在这种情况下,如果集合是急切的话,对象将被添加到内部列表中或从内部列表中删除,并且DAO调用也会影响[child]表。对于渴望和懒惰的收藏品。“
(Qazxswpoi)
在类本身的文档中,它还声明添加/删除被转发到数据库。 (http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#Foreign-Collection)
【使用从Jackson创建的对象在Android上使用OrmLite保存子集合】我从来没有使用过这个,所以我希望文档是正确的,这有助于你解决问题。 :-)
推荐阅读
- 使用android AudioRecord获得32位样本吗()
- Doctrine异常 - [DoctrineORMMappingMappingException]
- 如何更改UWP app文件夹名称或路径()
- 是否可以在没有管理员权限的情况下安装.appxbundle(UWP / XAML应用程序)()
- PrimaryLanguageOverride在发布appxbundle中不起作用
- 如何在android中的接口回调内部传输数据
- 在ASP.NET MVC App中初始化AutoMapper v6时出错
- 可捕获的致命错误(类Proxies的对象 __ CG __AppBundleEntityModelo无法转换为字符串)
- 使用appcmd添加新的网站问题