0

我创建了一个测试项目,以学习使用 Core Data。我所做的是,创建两个实体:

  • 客户
    • 姓名
      • 关系 --> 项目(To Many 关系)
  • 项目
    • 项目
      • 关系 --> 客户

我创建了 2 个 UITableViewControllers,一个显示所有客户端,一个显示与该客户端相关的所有项目。

为了显示所有相关项目,我创建了这个方法:

-(NSArray *)relatedProjects:(Client *)client;
{
    NSFetchRequest *request = [[NSFetchRequest alloc]init];

    NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Project"];

    [request setEntity:e];

   [request setPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", client.projects]];



    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"project"
                                                         ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sd]];

    NSError *error;
    NSArray *result = [context executeFetchRequest:request error:&error];


    if (!result) {
        [NSException raise:@"Fetch failed"
                    format:@"Reason: %@", [error localizedDescription]];
    }
    relatedProjects = [[NSMutableArray alloc] initWithArray:result];

//return result;
return relatedProjects; 

}

唯一的问题是只会显示 1 个项目而不是所有相关项目。如果我省略这一行,则显示所有项目,但项目与客户之间没有任何关系。

   [request setPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", client.projects]];

(对于我的测试用例,我创建了 1 个带有多个项目的客户端,所以我知道它应该显示超过 1 个项目)

所以我被困在如何解决这个问题上,因为有几种可能导致这不起作用:

  1. 谓词不行
  2. 客户和项目之间的关系不好
  3. ETC

因此,如果有人可以给我一些指示,那就太好了。

4

3 回答 3

0

你正在做很多工作。如果您在模型中对关系进行了建模,则 Client 已经拥有相关项目的列表。它将被命名为与关系相同的名称。当您获取 Client 对象时,项目列表将是一个“错误”,但一旦您访问它

NSArray* allProjects = client.projects;

Core Data 会意识到它还没有被填充,然后去为你获取列表。

快速总结:

-(NSArray *)relatedProjects:(Client *)client;
{
    return client.projects;
}

完毕。

这实际上就是您使用核心数据而不是直接使用 sql 的原因(以及许多其他很酷的原因)。

于 2013-04-23T18:40:29.240 回答
0

假设:
您在Client<<-->>Project之间存在多对多关系(您应该在编辑器中将两者的关系标记projectsclientsto -many)。
您已正确设置反向关系(在模型编辑器中)。
您正在正确地将对象添加到关系中。

尝试将谓词更改为:
[NSPredicate predicateWithFormat:@"%@ IN clients",client.objectID]

于 2013-04-23T19:06:58.997 回答
0

我更喜欢创建 Clint 模型

客户 -

# clientId

# clientName

# createProjects //relation to project

项目

# projectId

# project

# createdBy   // relation inverse to createProjects

当您获取数据时,首先获取客户端数据并使用数据加载 tableView。一旦选择了特定的客户端,就获取 projectDetails(使用关系)并加载 tableView。

client.createdProjects 将为您提供 Project 对象数组。

于 2013-04-23T18:28:07.163 回答