许多核心数据查询仅显示1条记录

时间:2013-04-23 18:14:59

标签: ios core-data nspredicate one-to-many

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

  • 客户端
      • relationship - >项目(To Many relationship)
  • 项目
    • 项目
      • relationship - >客户

我创建了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. 所以,如果有人能给我一些指示,那就太好了。

3 个答案:

答案 0 :(得分:0)

我更喜欢像

那样创建Clint模型

客户 -

# clientId

# clientName

# createProjects //relation to project

项目

# projectId

# project

# createdBy   // relation inverse to createProjects

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

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

答案 1 :(得分:0)

你正在做很多工作。如果您已在模型中建模关系,则客户已有一个相关项目列表。它将被命名为与关系相同。 当您获取客户端对象时,项目列表将是“故障”,但只要您访问它就

NSArray* allProjects = client.projects;

核心数据会意识到它尚未填充,并为您提取列表。

快速摘要:

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

完成。

这实际上是你为什么要使用核心数据而不是直接使用sql(除了很多其他很酷的原因)。

答案 2 :(得分:0)

假设:
您与客户<< - >>项目之间存在多对多关系(您应将projectsclients的关系标记为 to-many 在编辑) 您已正确设置反向关系(在模型编辑器中) 您正在将对象正确添加到关系中。

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