我有一个应用程序,可以理想地比较豪华餐厅和他们各自的菜肴相互之间。这意味着我有一个名为Restaurant
的核心数据实体,其中包含restaurantName
,location
,averagePrice
和foodType
等属性。我有一个名为MenuItem
的第二个核心数据实体,其中包含foodName
,caloryCount
,price
和rating
等属性。
由于目标是比较两个牛排馆和他们的菲力牛排的卡路里/价格/评级,我真的想要一个预载的MenuItem
对象列表(一个名为selectedMenuItems
)并以某种方式将其保存为Restaurant
实体的属性,以便每个餐馆都有一个附加到其上的菜单项对象的实例(之后用户可以编辑卡路里/价格/按餐馆分类的餐厅每个菜单项的评级)。在最理想的情况下,如果在selectedMenuItems
对象数组中添加或减去任何内容,它将反映在所有单独的餐馆中。
到目前为止我已尝试过:
1.。Restaurant
和MenuItem
之间的多对多关系
正如您可能从我上面的描述中猜到的那样,这并没有解决我想要的方式,因为它只将每个餐厅连接到selectedMenuItems
阵列,并且在餐馆中进行的任何更改都通过与阵列的关系(这是我对关系的一种基本误解)。
2.。)在Restaurant
中创建一个Transformable类型的属性来保存selectedMenuItems
数组
这看起来好像有一段时间了。正如我所说,我在我的menuItems
类型的Transformable实体中创建了一个名为Restaurant
的属性,然后在视图控制器中为每个餐馆的详细视图创建了一个属性(显示{{的视图控制器) 1}}是一个额外的导航步骤)我在menuItems
内添加了以下内容:
viewDidLoad()
这导致看似我需要的东西,除了我对// The selected Restaurant is passed from the prior screen to restaurant
restaurant.menuItems = selectedMenuItems as NSObject?
数组做了任何更改之外,它会导致应用程序因控制台读数selectedMenuItems
而崩溃。
3。)将对象的'NSInvalidArgumentException', reason: '-[Restaurant encodeWithCoder:]: unrecognized selector sent to instance
数组拆分为属性的匹配数组
在做了一些实验之后,看起来似乎有一个对象数组是问题。因此,我遍历selectedMenuItems
并将属性剥离到他们自己的数组中(selectedMenuItems
,foodNameArray
,caloryCountArray
等。之后,我将其中的每一个分配给我priceArray
实体的新创建的属性:
Restaurant
现在,这已经看起来非常狡猾,容易发生灾难性的失败。然而,它确实是我想要的方式。这里的问题是 restaurant.foodNames = foodNameArray as NSObject?
restaurant.caloryCounts = caloryCountArray as NSObject?
restaurant.prices = priceArray as NSObject?
的任何更改(如添加/删除新对象)在第一次加载后都没有传递到我的餐馆。这与1.)相比,其中变化从餐馆传播到selectedMenuItems
(从下到上)与3.)相比,我希望更改从上到下流动。
鉴于以上描述,是否有人就如何获得我正在寻找的功能提出建议?
答案 0 :(得分:1)
我会使用三个实体,而不是很多关系:
Restaurant
,正如您目前所拥有的那样; Dish
,代表通用菜单项,例如" Filet mignon"或"肋眼&#34 ;;和MenuItem
,这是由特定Dish
投放的特定Restaurant
。由于Dish
是通用的,因此它只有一个属性foodName
(尽管您可能需要其他属性)。 MenuItem
会有caloryCount
,price
,rating
的属性。
由于每个MenuItem
代表一个特定餐厅所供应的特定菜肴,因此它将具有#34; to-one"与Restaurant
和Dish
的关系。对于每个关系,倒数将是" to-many&#34 ;:一个餐厅将为许多MenuItems
提供服务,并且Dish
可以在许多MenuItems
中出现。
然后,您可以预先加载菜单列表,用户可以从中选择由特定餐厅提供的菜单。然后,您可以创建相应的MenuItems
,并且可以让用户记录卡路里/价格/评级。如果用户删除了MenuItem,则相应的Dish不受影响,因此可用于其他现有和/或新餐厅。如果用户想要添加一个没有现有Dish的MenuItem,您可以添加一个新的Dish,然后可用于任何后续的MenuItem。