2013-04-23 52 views
0

我已经创建了一个测试项目,学习如何使用Core Data。我所做的是,创建两个实体:许多核心数据查询只显示1条记录

  • 客户
      • 关系 - >项目(一对多的关系)
  • 项目
    • 项目
      • 关系 - >客户

我已创建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. 关系也不行

所以,如果有任何人谁可以给我一些指点,那将是巨大的。

+0

你设定的反比关系?为什么不只是返回'[client.projects allObjects]'? – 2013-04-23 18:31:06

+0

[client.projects allObjects]给出完全相同的输出,所以只返回1条记录。我如何设置反比关系?我认为这是自动设置的? – Eloy 2013-04-23 18:34:34

+0

如果你的意思是在检查员中设置inversie关系,那么我已经完成了。 – Eloy 2013-04-23 18:36:37

回答

0

在假设:
你有很多一对多的客户< <关系 - >>项目(你应该标记都projectsclients的关系,一对多在编辑器中)。
您已经正确设置了反转关系(在模型编辑器中)。
您正在将这些对象正确添加到关系中。

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

+0

谢谢。这是一对多的关系,一个客户可以有更多的项目,但一个项目只能有一个客户。在Client.h文件中可以看到NSSet *项目,而在project.h中可以看到Client *客户端。如果我尝试使用谓词,程序会出错。核心数据对我来说是新的,理解为什么。 – Eloy 2013-04-23 19:22:40

+0

我没有测试过这个谓词。我会测试它并回复你。 – 2013-04-23 19:26:24

+0

我已经测试了这个谓词,它对于一对多的关系似乎工作正常。你所描述的是你的关系没有被定义为多对多的,所以你正在寻找客户端是你选择的客户端的项目==>将客户端更改为客户端,并将谓词更改为[NSPredicate predicateWithFormat :@“client ==%@,client.objectID]' – 2013-04-23 19:49:24

0

我希望创建克林特模型像

客户端 -

# clientId 

# clientName 

# createProjects //relation to project 

项目

# projectId 

# project 

# createdBy // relation inverse to createProjects 

当你获取数据第一次提取客户数据和数据加载的tableView。一旦特定的客户端选择获取projectDetails(使用关系)并加载tableView。

客户端。createdProjects会为您提供一组Project对象。

+0

除了添加ID的属性,在我眼中,它看起来和你描述的一样。你知道是否有一种简单的方法来检查实体是否存储了正确的关系?如果我将NSLOG与%@结合使用,那么只需为“0x83b9da0 ” – Eloy 2013-04-23 18:40:55

+0

这些关系打印出类似于NSEntityDescription类型的对象将这些内容转换为客户端或项目然后打印。 – AMohan 2013-04-23 18:47:29

0

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

NSArray* allProjects = client.projects; 

核心数据会发现,它不填充尚未与去取列表为你。

快速摘要:

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

完成。

这实际上是为什么你使用核心数据,而不是直接使用sql(在许多其他很酷的理由)。

+0

NSArray * allProjects = client.projects给我这个警告:“不兼容的指针类型返回'NSSet *'从结果类型为'NSArray *'的函数'”那么这是否意味着我的关系不正确? – Eloy 2013-04-23 18:51:23