我们说我有一个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()
并断言它包含您期望的值。
答案 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来对此进行建模。