假设我有一个Ingredient实体和一个Recipe实体。很多食谱可能会用到相同的食材。
recipe 1 uses ingredients 1, 2 and 3
recipe 2 uses ingredients 1, 3 and 5
我希望能够从食谱中加载配料,但是不能反之。
我认为我需要通过创建一个单独的实体来跟踪所有配方<->成分映射,将其建模为多对多关系。
我的理解是正确的,还是有一些方法可以使这个工作与许多关系?
我不认为使用单个many关系会起作用,因为GreenDao要求它们在目标实体中有一个指向原始实体的外键(参见文档中的"建模到多关系")。这意味着配料只能引用一个配方——一旦两个配方引用了相同的配料,其中一个就会失去关系。
FTR,如果您没有在目标实体中设置外键,那么在重新启动应用程序后,many关系将丢失(即它仅适用于当前数据库会话)。提示:要在您的自动化测试中模拟此场景,只需在加载对象之前调用daoSession.clear()
并断言它包含您期望的值。
由于一个食材可以是多个食谱的一部分,而一个食谱由多个食材组成,因此这种关系显然是多对多关系。
在数据库中建模的常用方法是将关系存储在单独的表中。
这与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
这意味着一个从Ingredient到Recipe和从Ingredient到配料类型的多关联。从技术上讲,这也是一个多对多映射,在配料类型和配方之间有额外的属性。
在greendao中,您将使用两个tommany -relations来建模。