在db4o中创建对象时限制子复制

时间:2011-09-13 12:48:46

标签: android db4o

这是一种非常常见的情况,但我有点使用ORM,特别是在Android中,所以你的帮助会非常棒。

范围: 对象,例如消息具有原始字段和另一个对象的字段(子),例如讨论。所以它看起来像:

 public class Message {

    private int id;
    private String text;
    private Discussion discussion;

    public Message(int id, String text, int discussionId){
        this.id=id;
        this.text=text;
        discussion = new Discussion (discussionId);
    }
}

public class Discussion {

    private int id;
    private String title;

    public Discussion(int id) {
        this.id = id;
        this.title = "Sample title";
    }
}

note :: id由服务器提供,这就是为什么手动设置的原因。

问题: 如您所知,多条消息可能属于一个讨论。但是当我存储Message的列表时,我会得到带有重复讨论的表(与messages表大小相同)。怎么避免呢?

这里我如何存储Message ArrayList:

ArrayList<Message> itemsList = new ArrayList<Message>;
itemsList.add(new Message(1, "Message 1", 50));
itemsList.add(new Message(2, "Message 2", 50));

ItemDBProvider dbProvider = new ItemDBProvider();

for (Item item:itemsList) {
    dbProvider.store(item);
}

dbProvider.getDB().commit();
dbProvider.close();

我的意思是,不知何故,db4o应该检查Discussion对象是否已经在db(通过“id”字段)并限制创建重复。这是真的吗?

1 个答案:

答案 0 :(得分:3)

Db4o不知道您打算合并不同的Discussion对象,因为它们具有相同的id字段。 Db4o通过它们的身份(即==运算符)来区分对象,而不是对象的任何字段。您可以在数据库中拥有数百个相等的对象。

没有理由为每个Discussion创建一个新的Message对象 - 检索现有的对象,并将其设置为新Message对象的discussion字段。