如何用ORMLite保存嵌套对象?Android数据持久化问题排查
回答
嘿,这个问题我之前在项目里踩过坑,给你拆解下原因和解决办法:
1. 核心原因:外键对象默认不会自动加载
你当前的BestandItem里的ScanItem字段配置了foreign = true和foreignAutoCreate = true,这俩的作用是:
foreign = true:标记该字段是外键,关联到ScanItem表foreignAutoCreate = true:保存BestandItem时,如果关联的ScanItem还没入库,会自动创建并保存它
但重启后查询BestandItem时,ORMLite默认不会主动加载这个外键关联的对象——这就是你看到ScanItem内容丢失的关键!
而你疑惑的foreignAutoRefresh = true,正是解决这个问题的核心:它会让ORMLite在查询BestandItem时,自动执行关联查询,把对应的ScanItem对象从数据库里加载出来。
2. 修改字段配置即可解决
把BestandItem中ScanItem的注解改成下面这样:
@DatabaseField (foreign = true, foreignAutoCreate = true, foreignAutoRefresh = true) private ScanItem scanItem;
这样每次查询BestandItem的时候,ORMLite就会自动帮你拉取关联的ScanItem数据,不会出现空指针了。
3. 额外的检查点
- 你的实体类都有无参构造器,这是ORMLite的硬性要求,没问题;
Calendar用DataType.SERIALIZABLE序列化存储是可行的,但如果后续遇到兼容性问题,可以考虑转成Date类型(用DataType.DATE注解),这样存储更稳定;- 保存
BestandItem时,只要ScanItem对象有值,foreignAutoCreate会自动帮你把它存入数据库,这部分逻辑是没问题的。
4. 验证步骤
修改配置后,按下面的步骤验证:
- 保存一个包含有效
ScanItem的BestandItem; - 重启应用;
- 查询
BestandItem,检查scanItem字段是否正常加载。
如果还是有问题,可以开启ORMLite的SQL日志,查看查询BestandItem时是否执行了关联ScanItem的SQL语句,这样能快速定位问题。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

