核心数据一对多关系

时间:2014-03-12 03:02:34

标签: ios iphone core-data

我有一个场景,其中有一个实体可以拥有X个项目,具体取决于用户添加的内容。我有另一个实体需要与任意数量的第一个实体建立关系。这很容易,只需创建从第二个实体到第一个实体的一对多关系。

我遇到的问题是,如果第二个实体可以获取第一个实体的每个多个数,该怎么办?我不知道该怎么做。

实施例: 实体A包含:x,y,z 实体B可以包含(例如):x中的3个和y中的7个。或者8个x,7个y,2个z。全部取决于用户在应用中选择的内容。

2 个答案:

答案 0 :(得分:2)

CoreData不允许您建模(直接)关系,您可以将同一个对象多次添加到多对多关系中。

在您的情况下,您有两个我能想到的选项,它们都要求您为新的中间件关系实体建模。

假设您有实体AB。您现在需要创建一个实体AtoB,其中AtoB结构为:

关系:
a:与A实体的一对一关系 b:与B实体的一对一关系

  1. 第一个选项可让您在属性B中手动保留您喜欢的对象bCount的数量:
    1. 每次用户将A链接到B时,您都会增加现有关系的数量,或者使用正确的值创建新的AtoB对象(注意重复)
  2. 第二个选项是让用户在将AtoB实体链接到A实体时添加尽可能多的B关系(无唯一性):
    1. 需要时手动或通过分组获取这些项目的计数
  3. 在大多数情况下,我更喜欢第一种选择。

    A实体和B实体与AtoB实体之间存在多对多关系。

    您可以保持已经拥有的BA之间的多对多关系,因为我确信它有其目的。

答案 1 :(得分:0)

Example of Many-To-Many

在此示例中,有一个User实体可以有多个列表,但列表也可以有多个用户。然后列表也有任务,但这些任务也可以是多个列表的一部分。

例如

用户:  杰夫  罗斯

<强>解释  1.购物  2.家庭作业  3.家务活

<强>任务: 1,2,3,4,5。

<强>〔实施例

Rose -> Shopping   -> Task 1, Task 3, Task 4
     -> Chores     -> Task 2, Task 4

Jeff -> Homework   -> Task 3, Task 5
     -> Chores     -> Task 2, Task 4

修改

这就是您如何显示有关用户及其数据的不同信息。

// Fetch user 
User *user = [self getUserWithName:@"Rose"];

// Loop through lists
for (List *listObject in [user lists])
{
    // PRINT: (List Name) : (# of Tasks)
    NSLog(@"%@ : %lu", [listObject listName], (unsigned int)[[listObject tasks] count]);
}

例如,这将打印以下输出,因为我们为该示例提供了数据。

Shopping : 4 
Chores   : 2

编辑2:

如果您在实体用户任务下创建了 userId 字段,并为每个用户创建了userId,那么您可以过滤掉基于用户的任务使用与上述相同的模型,只需一个简单的NSPredicate。

[NSPredicate predicateWithFormat:@"userId == %@", @"123456789"];