Android GreenDao是否可以只在一个方向上建立多对多关系?

Android GreenDao是否可以只在一个方向上建立多对多关系?,android,orm,many-to-many,one-to-many,greendao,Android,Orm,Many To Many,One To Many,Greendao,假设我有一个配料实体和一个配方实体。很多食谱可能都提到同一种成分 recipe 1 uses ingredients 1, 2 and 3 recipe 2 uses ingredients 1, 3 and 5 我希望能够加载配方中的配料,但不能反向加载 我认为我需要通过创建一个单独的实体来跟踪所有配方成分映射,将其建模为多对多关系 我的理解正确吗,或者有什么方法可以让这项工作与许多人的关系融为一体吗? 我认为使用单个ToMany关系是行不通的,因为GreenDao要求它们在目标实体中有一个

假设我有一个配料实体和一个配方实体。很多食谱可能都提到同一种成分

recipe 1 uses ingredients 1, 2 and 3
recipe 2 uses ingredients 1, 3 and 5
我希望能够加载配方中的配料,但不能反向加载

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

我的理解正确吗,或者有什么方法可以让这项工作与许多人的关系融为一体吗?

我认为使用单个ToMany关系是行不通的,因为GreenDao要求它们在目标实体中有一个外键返回到原始实体(请参阅中的“建模到多个关系”)。这意味着配料只能引用一个配方——只要两个配方引用同一个配料,其中一个配方就会失去关联


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

由于一种成分可以是许多配方的一部分,而一种配方由许多成分组成,因此这种关系显然是一种多对多关系

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

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

更新

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

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
这意味着从配料到配方,从配料到配料类型,存在着许多关系。从技术上讲,这也是IngredientType和Recipe之间的一个多属性映射


在greendao中,您将使用两对多关系来建模。

您所描述的听起来像是多对多关系。您需要使用一个保持此关系的实体对此进行建模。你可以看到这个关于建模多对多关系的答案:因为配料不需要知道它们在什么菜谱中,我希望在GreenDao中有一种方法可以将其视为一个简单的ToMany关系(即,只使用GreenDao从菜谱中的ID延迟加载配料,而不是相反)。我很想将配料ID存储在配方中,并添加一个自定义的
getcontracents()
方法,以便按需加载它们。但看起来我偏离了预期的GreenDao用例。:-)@DanJ,我试图解释这不是一个绿岛问题。要对许多对象建模,需要一个联接表。无论您希望ORM层具有双向还是单向查找,这都无关紧要。