核心数据如何过滤(NSPredicate)包括关系要求和给定的关系对象?
core data how to filter (NSPredicate) including a relationship requirement and given the relationship object?
我将如何过滤(构造一个 NSPredicate)以下内容。
- 拥有 SCHOOL 和 PERSON 实体
- 一对多关系,即一个PERSON有一个SCHOOL,SCHOOL有多个PERSON
- 过滤方法的输入是 (a) 人员姓名(例如,所有人的名字都是 "Tom"),以及 (b) 学校本身的托管对象。
- 为了这个问题的目的,假设学校没有独特的属性
那么我的 confusion/observations 是:
- 我已经有了 School 托管对象本身,但是不确定在创建谓词时如何使用它?
- 但是,如果我创建了 NSPredicate,在任何情况下我如何创建与 SCHOOL 的关系,因为没有 ID(标识符)自己链接它们,因为我让 Core Data 这样做?
偏好是 SWIFT(但是,如果有人知道 Objective-C 也可能对我有帮助)。所以我再次尝试做的是:
- 获取所有 PERSON 对象,其名字 = "xxx",并且它们与以下 SCHOOL 托管对象相关联。
谓词就是您所期望的。
NSPredicate(format: "name = %@ && school = %@", "Tom", school)
但是,您可以通过使用另一个方向的关系和过滤器找到没有谓词的人。
let tom = school.persons.filter { [=11=].name == "Tom" }.first
(您可能需要将 NSSet
转换为 Set<Person>
)。
假设模型如下:
.. and 你想使用 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
)
我将如何过滤(构造一个 NSPredicate)以下内容。
- 拥有 SCHOOL 和 PERSON 实体
- 一对多关系,即一个PERSON有一个SCHOOL,SCHOOL有多个PERSON
- 过滤方法的输入是 (a) 人员姓名(例如,所有人的名字都是 "Tom"),以及 (b) 学校本身的托管对象。
- 为了这个问题的目的,假设学校没有独特的属性
那么我的 confusion/observations 是:
- 我已经有了 School 托管对象本身,但是不确定在创建谓词时如何使用它?
- 但是,如果我创建了 NSPredicate,在任何情况下我如何创建与 SCHOOL 的关系,因为没有 ID(标识符)自己链接它们,因为我让 Core Data 这样做?
偏好是 SWIFT(但是,如果有人知道 Objective-C 也可能对我有帮助)。所以我再次尝试做的是:
- 获取所有 PERSON 对象,其名字 = "xxx",并且它们与以下 SCHOOL 托管对象相关联。
谓词就是您所期望的。
NSPredicate(format: "name = %@ && school = %@", "Tom", school)
但是,您可以通过使用另一个方向的关系和过滤器找到没有谓词的人。
let tom = school.persons.filter { [=11=].name == "Tom" }.first
(您可能需要将 NSSet
转换为 Set<Person>
)。
假设模型如下:
.. and 你想使用 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
)