如何为给定的Core Data实体创建和保存对象的集合/数组?

时间:2016-12-13 21:53:18

标签: arrays object core-data swift3

我有一个应用程序,可以理想地比较豪华餐厅和他们各自的菜肴相互之间。这意味着我有一个名为Restaurant的核心数据实体,其中包含restaurantNamelocationaveragePricefoodType等属性。我有一个名为MenuItem的第二个核心数据实体,其中包含foodNamecaloryCountpricerating等属性。

由于目标是比较两个牛排馆和他们的菲力牛排的卡路里/价格/评级,我真的想要一个预载的MenuItem对象列表(一个名为selectedMenuItems)并以某种方式将其保存为Restaurant实体的属性,以便每个餐馆都有一个附加到其上的菜单项对象的实例(之后用户可以编辑卡路里/价格/按餐馆分类的餐厅每个菜单项的评级)。在最理想的情况下,如果在selectedMenuItems对象数组中添加或减去任何内容,它将反映在所有单独的餐馆中。

到目前为止我已尝试过:

1.。RestaurantMenuItem之间的多对多关系

正如您可能从我上面的描述中猜到的那样,这并没有解决我想要的方式,因为它只将每个餐厅连接到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并将属性剥离到他们自己的数组中(selectedMenuItemsfoodNameArraycaloryCountArray等。之后,我将其中的每一个分配给我priceArray实体的新创建的属性:

Restaurant

现在,这已经看起来非常狡猾,容易发生灾难性的失败。然而,它确实是我想要的方式。这里的问题是 restaurant.foodNames = foodNameArray as NSObject? restaurant.caloryCounts = caloryCountArray as NSObject? restaurant.prices = priceArray as NSObject? 的任何更改(如添加/删除新对象)在第一次加载后都没有传递到我的餐馆。这与1.)相比,其中变化从餐馆传播到selectedMenuItems(从下到上)与3.)相比,我希望更改从上到下流动。

鉴于以上描述,是否有人就如何获得我正在寻找的功能提出建议?

1 个答案:

答案 0 :(得分:1)

我会使用三个实体,而不是很多关系:

  • Restaurant,正如您目前所拥有的那样;
  • Dish,代表通用菜单项,例如" Filet mignon"或"肋眼&#34 ;;和
  • MenuItem,这是由特定Dish投放的特定Restaurant

由于Dish是通用的,因此它只有一个属性foodName(尽管您可能需要其他属性)。 MenuItem会有caloryCountpricerating的属性。

由于每个MenuItem代表一个特定餐厅所供应的特定菜肴,因此它将具有#34; to-one"与RestaurantDish的关系。对于每个关系,倒数将是" to-many&#34 ;:一个餐厅将为许多MenuItems提供服务,并且Dish可以在许多MenuItems中出现。

然后,您可以预先加载菜单列表,用户可以从中选择由特定餐厅提供的菜单。然后,您可以创建相应的MenuItems,并且可以让用户记录卡路里/价格/评级。如果用户删除了MenuItem,则相应的Dish不受影响,因此可用于其他现有和/或新餐厅。如果用户想要添加一个没有现有Dish的MenuItem,您可以添加一个新的Dish,然后可用于任何后续的MenuItem。