2014-06-08 52 views
3

比方說,我有一個成分實體和一個食譜實體。許多食譜可能指的是相同的成分。GreenDao只能在一個方向上執行To-Many關係嗎?

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

我希望能夠從配方加載的成分,但不相反。

我想我需要通過創建一個單獨的實體來跟蹤所有配方< - >成分映射,將其建模爲多對多關係。

我的理解是正確的,或者是有一些方法,使具有一對多的關係,這項工作?

我不認爲使用單個ToMany關係將會起作用,因爲GreenDao要求他們在目標實體中有一個外鍵返回到原始實體(請參閱docs中的「建模多對多關係」)。這意味着配料只能引用一個配方 - 只要兩個配方參考相同的配料,那麼其中一個會失去它的關係。

FTR,如果不建立外鍵的目標實體,則一對多關係重新啓動應用程序後會丟失(即它僅適用於當前的數據庫會話)。提示:要在自動化測試中模擬此場景,請在加載對象並聲明它包含您期望的值之前調用daoSession.clear()

+0

您所描述的內容聽起來像是多對多的關係。你需要用一個擁有這種關係的實體來建模。你可以看到這個答案,它涉及建模一個多對多的關係:http://stackoverflow.com/a/14837390/1163156 – mweathers

回答

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一個一對多-關係。從技術上講,這也是Many2Many-Mapping與IngredientType和Recipe之間的附加屬性。

在greendao中,您將使用兩個toMany-relations來對此進行建模。

+0

由於配料不需要知道他們在哪些食譜,我希望可能有一個在GreenDao中將其視爲一種簡單的ToMany關係(即只使用GreenDao從食譜中的ID延遲加載配料,但不是相反)。我試圖將配方ID存儲在配方中,並添加一個自定義的'getIngredients()'方法來按需加載它們。看起來我偏離了預期的GreenDao用例。 :-) –

+0

@DanJ正如我試圖解釋這不是一個greendao問題。爲了建模Many2Many,你需要一個連接表。無論您是要讓您的ORM層進行雙向還是單向查找,都無關緊要。 – AlexS

相關問題