1. 第一个涉及我正在准备的当前食谱。 2. 第二个存储我决定保存的食谱。
标准情况下,我的当前食谱是“芝士蛋糕”,在RecipeDetailViewController中,我可以看到我为此食谱添加的当前配料:糖、牛奶、黄油等等。现在,假设我对最终结果感到满意,并决定保存(记录)我刚刚准备的食谱。点击“保存”按钮后,该食谱现已保存(已记录),并且在RecipesHistoryViewController中,我可以看到类似以下内容:
- 2013年11月15日 - 芝士蛋糕 - 2013年11月11日 - 布朗尼 - 等等。
现在,如果我想要在历史记录中编辑该食谱并将牛奶更改为豆浆等,问题在于在历史记录中编辑食谱不应编辑当前食谱(及其配料),反之亦然。如果我编辑当前食谱并将黄油替换为花生酱,则不得编辑历史记录中的任何一个食谱。这就是问题所在。
这种情况意味着什么?这意味着,为了满足这些功能,我每次用户单击“保存食谱”按钮时都会复制该食谱及其每个子关系(配料)。它可以工作,但我感觉还有其他更干净的方法。使用此实现,我会拥有许多不同的重复Core Data对象(sqlite行),例如:
- 对象#1,名称:黄油,食谱:1 - 对象#2,名称:黄油,食谱:4 - 对象#3,名称:黄油,食谱:3 - 等等。
有什么好的想法吗?如何优化此模型结构?
编辑1:我已经考虑创建任何RecipeHistory对象,并带有一个NSString属性,可以在其中存储json字典,但我不知道这是否更好。
编辑2:当前RecipeHistory对象包含以下内容:
+-- RecipeHistory --+
| |
| attributes: |
| - date |
+-------------------+
| relationships: |
| - recipes |
+-------------------+
+----- Recipe ------+
| relationships: |
| - recipeInfo |
| - recipeshistory |
| - ingredients |
+-------------------+
+-- RecipeInfo ----+
| |
| attributes: |
| - name |
+-------------------+
+--- Ingredient ----+
| |
| attributes: |
| - name |
+-------------------+
| relationships: |
| - recipe |
+-------------------+
当paulrehkugler说在创建
RecipeHistory
时复制每个Recipe
对象(以及其关系RecipeInfo和Ingredients)是正确的,这将填充数据库大量的数据,但我找不到另一种解决方案,可以让我未来更加灵活。也许在未来,我会创建有关食谱和历史记录的统计信息,并且拥有Core Data对象可能会证明有用。你怎么想?我认为这是许多存储历史记录并允许编辑历史记录项目的应用程序中常见的情况。
重要更新
我已经阅读了一些用户的答案,并希望更好地解释一下情况。上面提到的示例只是一个示例,我的应用程序没有涉及烹饪/食谱参数,但我使用食谱,因为我认为它非常适合我的实际情况。
说了这些,我想解释一下应用程序需要两个部分: - 第一部分:在其中可以查看当前食谱及相关成分 - 第二部分:在其中可以查看我通过点击第一部分中的“保存食谱”按钮决定保存的食谱
第一部分中找到的当前食谱和第二部分中找到的X食谱没有任何共同点。但是,用户可以编辑“历史”部分中保存的任何食谱(他可以编辑名称、成分或其他任何内容,他可以完全编辑有关在历史记录部分中找到的食谱的所有内容)。
这就是为什么我会想到复制所有NSManagedObject
。然而,以这种方式,数据库将像疯狂增长一样,因为每次用户保存当前食谱时,代表食谱的对象(Recipe
)都会被复制,还有食谱所拥有的关系(成分)。因此,将有大量名为“Butter”的成分。你可以问我:为什么你需要有大量的“Butter”对象?嗯,我需要它,因为成分例如具有“数量”属性,因此每个食谱都有不同数量的成分。
无论如何,我不喜欢这种方法,即使它似乎是唯一的方法。问我任何问题,我会尝试解释每一个细节。
PS:对我的基础英语表示抱歉。
编辑