arraylist - 如何将 ORMLite 与包含其他对象的 ArrayList 的对象一起使用?

标签 arraylist ormlite eager foreign-collection

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

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

我不想与数据库持续同步,而是有一个保存整个结构的保存方法和一个恢复整个方法的读取方法。从数据库恢复对象后,该对象将通过接口(interface)发送,其中接收者需要 ArrayList,而不是 orm liteForeignCollections。

我的方法如下。对于每个 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 的对象?

最佳答案

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

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

setter/getter 为

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

因此它会动态创建 ArrayList,而不是尝试维护它。

显然您可能已经意识到这一点,但您还需要小心编写对象,因为急切设置会影响读取外部集合,它不会对外部字段或写入记录时执行任何操作。

关于arraylist - 如何将 ORMLite 与包含其他对象的 ArrayList 的对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180142/

相关文章:

Java HashMap 像 ArrayList 一样加入了增强的 for 循环

java - NetBeans 默认 Jlist 将其更改为 arraylist

java - ORMlite 更改主键

android - 更新外部对象 ORMLite - ANDROID

python - Eager 模式不支持 Tensorflow v1.4 : Layer. 输入

java - Hibernate 中的动态预加载和延迟加载

java - 按字母顺序对 ArrayList<String[]> 进行排序

java - 我应该如何将请求主体映射到另一个对象,同时保持相同的子关系?

android - 如何删除 ORMLite 数据库?

tensorflow - TensorFlow Eager 模块有什么用?