Ios 核心数据查询多只显示1条记录

Ios 核心数据查询多只显示1条记录,ios,core-data,nspredicate,one-to-many,Ios,Core Data,Nspredicate,One To Many,我创建了一个测试项目,学习如何使用核心数据。我所做的是创建两个实体: 客户 名字 关系-->项目(对多个关系) 计划 计划 关系-->客户端 我创建了两个UITableViewController,一个显示所有客户端,另一个显示与该客户端相关的所有项目 要显示我创建此方法的所有相关项目,请执行以下操作: } 唯一的问题是,它将只显示一个项目,而不是所有相关的项目。 如果我省略这一行,那么会显示所有项目,但项目和客户机之间没有关系 (对于我的测试用例,我创建了一个包含多个项目的

我创建了一个测试项目,学习如何使用核心数据。我所做的是创建两个实体:

  • 客户
    • 名字
      • 关系-->项目(对多个关系)
  • 计划
    • 计划
      • 关系-->客户端
我创建了两个UITableViewController,一个显示所有客户端,另一个显示与该客户端相关的所有项目

要显示我创建此方法的所有相关项目,请执行以下操作:

}

唯一的问题是,它将只显示一个项目,而不是所有相关的项目。 如果我省略这一行,那么会显示所有项目,但项目和客户机之间没有关系

(对于我的测试用例,我创建了一个包含多个项目的客户端,因此我知道它应该显示多个项目)

因此,我被困在如何解决这个问题上,因为有几种可能会导致此问题无法解决:

  • 谓词不正确
  • 客户和项目之间的关系不正常

  • 所以,如果有人能给我一些建议,那就太好了。

    我更喜欢创建像这样的Clint模型

    客户-

    # clientId
    
    # clientName
    
    # createProjects //relation to project
    
    计划

    # projectId
    
    # project
    
    # createdBy   // relation inverse to createProjects
    
    获取数据时,首先获取客户机数据并加载带有数据的tableView。一旦选择了特定的客户机,获取projectDetails(使用关系)并加载tableView


    client.createdProjects将为您提供一系列项目对象。

    您正在做大量的工作。如果您已经在模型中对关系进行了建模,那么客户机已经有了相关项目的列表。它将被命名为与关系相同的名称。 获取客户机对象时,项目列表将是一个“错误”,但一旦您访问它

    NSArray* allProjects = client.projects;
    
    核心数据将意识到它还没有填充,然后去为您获取列表

    快速总结:

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


    这就是为什么您使用核心数据而不是直接使用sql的原因(还有许多其他很酷的原因)。

    假设:
    ClientProject之间存在多对多关系(您应该在编辑器中将
    项目
    客户端
    的关系标记为对多关系)。
    您已正确设置了反向关系(在模型编辑器中)。
    您正在将对象正确添加到关系中

    尝试将谓词更改为:

    [NSPredicate predicateWithFormat:@“%@IN clients”,client.objectID]

    您设置了反向关系吗?为什么不直接返回
    [client.projects allObjects]
    ?[client.projects allObjects]给出完全相同的输出,因此只返回1条记录。如何设置反向关系?我认为这是自动设置的?如果你的意思是在inspector中设置反向关系,那么我已经这样做了。除了添加ID属性,在我看来,它似乎与你描述的相同。您知道是否有一种简单的方法来检查实体是否以正确的关系存储吗?如果我将NSLOG与%@结合使用,则只需为关系“0x83b9da0”打印类似的内容,这些对象是NSEntityDescription类型的对象,因此请将这些对象类型转换为Client或Project,然后打印.NSArray*allProjects=Client.projects给我以下警告:“从结果类型为'NSArray*'的函数返回'NSSet*'的不兼容指针类型”“那么这是否意味着我的关系不正确?谢谢。这是一种一对多的关系,一个客户可以有更多的项目,但一个项目只能有一个客户。在Client.h文件中可以看到NSSet*项目,在project.h文件中可以看到Client*客户机。如果我尝试使用你的谓词,程序就会出错。而核心数据对我来说是新的,要理解为什么。我还没有测试这个谓词。我将测试它并返回给您。我已经测试了这个谓词,它似乎适用于一对多关系。您所描述的是,您的关系没有定义为多对多,因此您正在搜索项目,其中客户机是您选择的客户机==>将
    客户机更改为
    客户机
    ,将谓词更改为
    [NSPredicate predicateWithFormat:@“client=%@,client.objectID]
    您好,它现在正在工作。除了您的NSPredicate之外,我还必须更改一些代码。保存时,我这样做了//保存对项目和客户端的更改[project setProject:[nameProject text];[project SetClient:client];NSSet*s=[NSSet setWithObject:project];[client setProject:s];删除最后一行后,它工作了。
    NSArray* allProjects = client.projects;
    
    -(NSArray *)relatedProjects:(Client *)client;
    {
        return client.projects;
    }