我已经创建了一个测试项目,以学习使用Core Data。我所做的是创建两个实体:
我创建了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个项目)
所以我被困在如何解决这个问题,因为有几种可能性,为什么这不起作用:
所以,如果有人能给我一些指示,那就太好了。
答案 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)
假设:
您与客户<< - >>项目之间存在多对多关系(您应将projects
和clients
的关系标记为 to-many 在编辑)
您已正确设置反向关系(在模型编辑器中)
您正在将对象正确添加到关系中。
尝试将谓词更改为:
[NSPredicate predicateWithFormat:@"%@ IN clients",client.objectID]