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

时间:2013-03-02 22:25:06

标签: arraylist ormlite eager foreign-collection

我有一个Android java项目,其数据类型非常复杂,包括其他复杂数据类型的ArrayLists。我正在尝试使用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框架处理包含复杂类型的ArrayLists的对象?

1 个答案:

答案 0 :(得分:4)

我的代码使用ArrayLists确定。我宣布我的领域是这样的:

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

和getter as

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

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

显然你可能已经意识到了这一点,但是你也需要小心编写对象,因为热切的设置会影响读取外来集合,它对外来字段或写记录时都不会做任何事情。