【问题标题】:How can I use ORMLite with objects that contain ArrayLists of other objects?如何将 ORMLite 与包含其他对象的 ArrayLists 的对象一起使用?
【发布时间】:2013-03-02 22:25:05
【问题描述】:

我有一个具有相当复杂数据类型的 Android java 项目,包括其他复杂数据类型的 ArrayList。我正在尝试使用 ORMLite (4.42) 将我的数据存储在数据库中。

我在 ArrayLists 和 ForeignCollection 之间转换时遇到了重大问题,有人能做到这一点吗?

我不希望与数据库持续同步,而是有一个保存整个结构的 save 方法和一个恢复整个方法的 read 方法。从数据库中恢复一个对象后,该对象通过接口发送,接收者需要一个 ArrayLists 而不是 orm lite ForeignCollections。

我的方法如下。对于每个 ArrayList,我都有一个互补的 ForeignCollection。在将对象存储到数据库之前,将 ArrayList 的内容复制到 ForeignCollection,当读回时,反之亦然。

当我从数据库中读出一个数据结构时,我希望确保整个结构被恢复,因为稍后,该对象将被发送给不知道 orm lite 包的用户,因此我设置了 eager = true .

我的复杂数据类型如下所示:

@DatabaseTable(tableName = "accounts")
public class Account {

    @DatabaseField(generatedId = true)
    private int id;

    @ForeignCollectionField (eager = true, maxEagerLevel = 2)
    private ForeignCollection<Order> ordersFoC;
    private ArrayList<Order> ordersArL;

问题

在将帐户存储到数据库之前,我尝试执行以下操作。我希望将 ArrayList 中的对象复制到 ForeignCollection 并使用 Account 对象更新数据库。对象 myAccount 与数据库中的对象具有相同的 id,因此我希望更新该对象。

ordersFoC.addAll(orderArL);
myDao.createOrUpdate(myAccount);

运气不好。 addAll 方法确实将订单直接写入数据库,因此我最终得到了所有订单的重复项,因为“addAll”添加并且不更新任何现有记录。

所以我尝试先从数据库中删除所有订单,但再次失败:

ordersFoC.clear(); // Also tried: ordersFoC.removeAll(ordersFoC);
ordersFoC.addAll(orderArL);
myDao.createOrUpdate(myAccount);

对象不会从数据库中删除。我在groups.google.com (by Philip Fu) 读到,这是 ormlite 的一个“已知”问题,急切的 ForeignCollection 不能很好地与 removeAll() 或 clear() 配合使用。

是否有我遗漏的模式允许我使用 ormlite 框架处理包含复杂类型的 ArrayList 的对象?

【问题讨论】:

标签: arraylist ormlite eager foreign-collection


【解决方案1】:

我的代码可以使用 ArrayLists 了。我这样声明我的字段:

@ForeignCollectionField(eager = true, maxEagerForeignCollectionLevel = 99)
private Collection<PersonalNameStructure> personalnamestructures = new ArrayList<>();

getter 为

public List<PersonalNameStructure> getPersonalNameStructures() {
    return new ArrayList<>(personalnamestructures) ;
}

因此它会即时创建 ArrayList 而不是尝试维护它。

显然您可能已经意识到这一点,但您也需要在编写对象时小心谨慎,因为 Eager 设置会影响读取外部集合,它不会对外部字段或写入记录做任何事情。

【讨论】:

  • 您正在从personalnamestructures 创建ArrayList&lt;PersonalNameStructure&gt; 的新实例。但是我只是好奇,你检查过personalnamestructures的类型吗?有没有可能它已经属于ArrayList&lt;PersonalNameStructure&gt; 类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2018-08-02
  • 2020-11-20
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多