核心数据如何过滤(NSPredicate)包括关系要求和给定关系对象?

Gre*_*reg 6 core-data relationship nspredicate ios swift

我将如何过滤(构建NSPredicate)以获取以下内容.

  • 有一个SCHOOL和PERSON实体
  • 一对多的关系,即一个PERSON有一个学校,学校有很多人
  • 过滤方法的输入是(a)人名(例如,所有名称为"Tom"),以及(b)学校本身的管理对象.
  • 出于这个问题的目的,假设学校没有独特的属性

那么我的困惑/观察是:

  • 我已经拥有了学校托管对象,但是在创建谓词时不确定如何使用它?
  • 但是,如果我创建NSPredicate,我如何在任何情况下创建与SCHOOL的关系,因为我自己没有ID(标识符)链接它们,因为我让Core Data这样做?

偏好是SWIFT(但是如果有人在Objective-C中知道也可能对我有帮助).所以我想再做的是:

  • 获取所有PERSON对象,其名称为"xxx",并且与以下SCHOOL管理对象关联.

Mun*_*ndi 8

谓词就是你所期望的.

NSPredicate(format: "name = %@ && school = %@", "Tom", school)
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过在另一个方向上使用关系并过滤来找到没有谓词的人.

let tom = school.persons.filter { $0.name == "Tom" }.first
Run Code Online (Sandbox Code Playgroud)

(你可能需要投你NSSet的Set<Person>).

  • 除非有我遗漏的东西,否则这是一个完全不涉及核心数据的纯Swift解决方案.您只需将与学校相关联的每个人的故障发送到内存中,然后手动检查每个人是否符合条件.这几乎总是错误的解决方案. (3认同)

So *_* It 7

假设以下模型:

在此处输入图片说明

..并且您想使用NSPredicate.. 您可以尝试以下操作:

func searchSchool(school: School, firstName: String) -> [Person] {

    let request = NSFetchRequest(entityName: "Person")
    let predicate = NSPredicate(format: "school == %@ && firstName == %@", school, firstName)
    request.predicate = predicate

    // we will perform the request on the context associated with the School NSManagedObject
    guard let context = school.managedObjectContext else {
        print("provided School managed object is not associated with a managed object context")
        return []
    }

    do {
        return try context.executeFetchRequest(request) as? [Person] ?? []
    } catch {
        return []
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,不要忘记其他选项(例如遍历关系并filter按照@Mundi 的建议使用)