Ios 将2个值合并为一个NSPredicate

Ios 将2个值合并为一个NSPredicate,ios,xcode,core-data,swift3,nspredicate,Ios,Xcode,Core Data,Swift3,Nspredicate,我正在尝试执行一个获取请求,该请求检查两件事 以下是我的数据: 人-实体 报表-实体 个人实体与多个报表都有关系。语句实体有一个名为AMONTOWED的属性。这是我要在谓词中签入的属性 编辑 我想做的就是这样。 检查我所有的个人实体是否有名字,比如Bob 一旦我找到Bob实体,我想检查他的所有语句实体是否有一个名为amUntowed的属性,看看它是否大于或小于0 检查Person实体中的名称。当该名称匹配时,使用该实体 检查语句实体中的amuntowed是否大于或小于0 这就是我一直在努力的工作

我正在尝试执行一个获取请求,该请求检查两件事

以下是我的数据:

人-实体 报表-实体 个人实体与多个报表都有关系。语句实体有一个名为AMONTOWED的属性。这是我要在谓词中签入的属性

编辑 我想做的就是这样。 检查我所有的个人实体是否有名字,比如Bob

一旦我找到Bob实体,我想检查他的所有语句实体是否有一个名为amUntowed的属性,看看它是否大于或小于0

  • 检查Person实体中的名称。当该名称匹配时,使用该实体
  • 检查语句实体中的amuntowed是否大于或小于0
  • 这就是我一直在努力的工作

    let fetchRequest: NSFetchRequest<Person> = Person.fetchRequest()
    fetchRequest.predicate = NSPredicate(format:"name == %@ AND @statement.amountOwed >= 0", personName))
    let sort = NSSortDescriptor(key: #keyPath(Person.name), ascending: true)
    fetchRequest.sortDescriptors = [sort]
    positiveFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: coreDataStack.managedContext, sectionNameKeyPath: nil, cacheName: nil)
    
    do {
        try positiveFetchedResultsController.performFetch()
    } catch let error as NSError{
        print("Fetching error: \(error), \(error.userInfo)")
    }
    
    我在这里找到了方法:

    编辑 试试这个:

    NSPredicate(format:"name == %@ AND statement.@amountOwed >= 0", personName)
    

    必须是字符串的一部分,如您所附的示例…

    您应该构建FRC以获取
    语句
    对象,而不是
    个人
    对象:

    let fetchRequest: NSFetchRequest<Statement> = Statement.fetchRequest()
    
    (对于负数
    amuntowed
    )也是如此。指定排序描述符以获得所需的排序顺序。然后,FRC的
    fetchedObject
    数组将包含
    语句
    对象,您可以使用这些对象填充表视图:第0节的正FRC和第1节的负FRC(反之亦然)


    注意。由于您正在获取
    语句
    对象,因此仅使用一个FRC就可以实现所需的功能,但前提是您对语句按
    数量排序(升序或降序)感到满意。如果您希望这样做,我可以提供更多详细信息。

    为什么没有人阅读?;-)错误是“此处不允许使用多个密钥”。谓词中只有一对多键:“statement.amuntowed>=0”。因此,错误是说“每个人都可以有许多语句-我应该使用哪一个?最大值的语句?还是最小值的语句?或者任何语句上的最大值?或者检查所有语句上的最大值?或者(我认为你的意思是)将所有相关语句的amuntowed相加。如果是最后一个,请使用
    fetchRequest.predicate=NSPredicate(格式:“name=%@和statement.@sum.amuntowed>=0”,personName)
    。我正在尝试显示每个人的所有语句,并将它们划分为负数和正数,然后在tableView的一部分中显示每个FRC。这有意义吗?为了澄清,您的table view将显示单个人的语句。每行将代表单个语句(针对该人)。将有两个部分;一个显示带+ve amuntowed的语句,另一个显示带-ve amuntowed的语句。如果这是正确的,您希望行的顺序是什么?这是正确的。行可以是任意顺序。如果从最大到最小更容易显示,那就可以了。重要的是,选项卡的每个部分le视图显示正确。一部分为正金额,一部分为负金额。我是否需要属性AMONTOWED前面的@?它应该是:
    fetchRequest.predicate=NSPredicate(格式:“name==%@和statement.amonTOWED>=0”,personName)
    。当我尝试任何一种方法时,都会出现错误。由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“对多个键不允许,这是代码中的一个变量吗?请像这样尝试NSPredicate(格式:“name==%@和%@>=0”,personName,statement.amounted)否欠款额是对账单实体的一个属性。我正在提取的Person实体可以有多个对账单实体链接到它。因此,我尝试按姓名提取一个人,然后查看他们的所有对账单实体。我在这方面没有经验,但和必须在格式字符串中。很好,luckHi,我尝试实现了我自己不知道你的想法。它不起作用,所以我非常感谢你提供更多关于你想法的详细信息。它似乎没有找到谓词中有名称的实体。我今天晚些时候会更新我的答案-同时,请你发布一张你的数据模型的图片?谢谢。让我知道你是否正在从我的数据中寻找这些实体model.My fetch请求返回0,即使我知道有一个已保存。确定。删除谓词,运行fetch,然后打印结果。检查“person”属性以获取语句,然后检查“person.name”。
    let fetchRequest: NSFetchRequest<Statement> = Statement.fetchRequest()
    
    fetchRequest.predicate = NSPredicate(format:"person.name == %@ AND amountOwed >= 0", personName)