GreenDao是否可以只在一个方向上建立To-Many关系?

时间:2014-06-08 16:55:57

标签: android orm many-to-many one-to-many greendao

我们说我有一个Ingredient实体和一个Recipe实体。许多食谱可能指的是相同的成分。

recipe 1 uses ingredients 1, 2 and 3
recipe 2 uses ingredients 1, 3 and 5

我希望能够从食谱中加载成分,但不是相反。

我认为我需要通过创建一个单独的实体来跟踪所有配方< - >来将其建模为多对多关系。成分映射。

我的理解是否正确,或者是否有某种方法可以使用ToMany关系进行此操作?

我不认为使用单个ToMany关系会起作用,因为GreenDao要求他们将目标实体中的外键返回到原始实体(参见"建模多对多关系"在docs)。这意味着配料只能参考一个配方 - 一旦两个配方参考相同的成分,那么其中一个将失去它的关系。

FTR,如果您未在目标实体中设置外键,则重新启动应用程序后ToMany关系将丢失(即,它仅适用于当前数据库会话)。提示:要在自动化测试中模拟此场景,只需在加载对象之前调用daoSession.clear()并断言它包含您期望的值。

1 个答案:

答案 0 :(得分:0)

由于一种成分可以是许多食谱的一部分,而一种食谱由许多成分组成,这种关系显然是多对多的关系。

在数据库中对此进行建模的常用方法是将关系存储在单独的表中。

这与greendao的使用无关。要使用greendao实现此模型,您必须创建一个新实体RecipeToIngredient并使用此实体构建您的关系。

<强>更新

如果您可以自由设计数据库,可以使用以下模式:

Table IngredientType
--------------------------
id          | integer (pk)
description | text

Table Recipe
--------------------------
id          | integer (pk)
description | text

Table Ingredient
--------------------------
id_recipe   | integer (fk)
id_type     | integer (fk)
unit        | text
quantity    | integer

这意味着从成分到配方以及从Igredient到IngredientType的toMany关系。从技术上讲,这也是一个Many2Many-Mapping,在IngredientType和Recipe之间有其他属性。

在greendao中,您将使用两个toMany-relations来对此进行建模。