如何通过GreenDAO实现双向一对一的关系?

时间:2012-07-22 10:42:56

标签: java android orm greendao

我在我的Android应用程序的DAL层使用ORM GreenDAO。我在两个表之间的一对一关系中遇到了问题。例如:

Entity page = schema.addEntity("Page");
Entity bookmark = schema.addEntity("Bookmark");

Property pageIdProperty = bookmark.addLongProperty("pageId").getProperty();

bookmark.addToOne(page, pageIdProperty); // any bookmark related to a page
page.addToOne(bookmark, pageIdProperty); // any page can has a bookmark

这种关系是错误的吗?

当我定义它时,我无法在 Page Class

中调用page.getBookmark()

如果这是真的,我是否能以一对一的关系使其双向化?

3 个答案:

答案 0 :(得分:5)

首先,一对一关系的良好用例很少见。你确定它不是一对多吗?如果你仍然认为它是一对一的:将两个实体合并为一个是否合理?

除此之外,bookmark.addToOne(page,pageIdProperty)还可以,而page.addToOne(bookmark,pageIdProperty)不起作用。 To-one关系要求id属性位于同一实体中。 To-many会以这种方式工作,请查看documentation on relation以获取详细信息。

答案 1 :(得分:1)

到目前为止,最佳解决方法是在外键存在的实体上使用addToOne,在另一端使用addToMany。它不是非常不方便,因为您只需要确保将一个对象添加到列表中。

答案 2 :(得分:0)

您有几个错误。首先,您需要在书签上的FK属性之前创建PK。

试试这个:

Entity page = schema.addEntity("Page"); 
Entity bookmark = schema.addEntity("Bookmark");

bookmark.addLongProperty("bookmarkId").primaryKey().autoincrement();
Property fkPage = bookmark.addLongProperty("pageId").getProperty();

bookmark.addToOne(page, fkPage).setName("page"); 

为Page实体执行相同的步骤。