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

时间:2016-03-13 08:56:39

标签: ios swift core-data relationship nspredicate

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

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

那么我的困惑/观察是:

  • 我已经拥有了学校托管对象本身,但是在创建谓词时不确定如何使用它?
  • 但是,如果我创建NSPredicate,我如何在任何情况下创建与SCHOOL的关系,因为我没有自己链接它们的ID(标识符),因为我让核心数据执行此操作?

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

  • 获取所有PERSON对象,其名字=" xxx",并且与之对应的以下SCHOOL管理对象。

2 个答案:

答案 0 :(得分:7)

谓词就是你所期望的。

NSPredicate(format: "name = %@ && school = %@", "Tom", school)

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

let tom = school.persons.filter { $0.name == "Tom" }.first

(您可能需要将NSSet转换为Set<Person>)。

答案 1 :(得分:4)

假设以下型号:

enter image description here

.. 您想使用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 []
    }

}

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