这是苹果官方文档 Core Data Programming Guide 的渣翻译。
现在数据已经存在了Core Data持久化存储中了,你可以使用一个NSFetchRequest来访问已经存在的数据。这个Core Data的对象查询是这个框架最强大的特性之一。
查询NSManagedObject实例
在这个例子中,你开始构造一个NSFetchRequest来描述你想要的返回数据。这个例子除了返回的Entity类型,没有添加其他要求。你可以在MOC上调用executeFetchRequest:error:,并传入一个error指针。
OBJECTIVE-C
NSManagedObjectContext *moc = …;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
if (!results) {
DLog(@"Error fetching Employee objects: %@\n%@", [error localizedDescription], [error userInfo]);
abort();
}
SWIFT
let moc = managedObjectContext
let employeesFetch = NSFetchRequest(entityName: "Employee")
do {
let fetchedEmployees = try moc.executeFetchRequest(employeesFetch) as! [AAAEmployeeMO]
} catch {
fatalError("Failed to fetch employees: \(error)")
}
方法executeFetchRequest:error:有两个可能的结果。它会返回一个包含了0个或更多元素的NSArray数组,或者返回nil。如果返回了nil,你会从Core Data接收到一个error并作出应对操作。如果数组存在,但有可能是空的。空的数组表示没有符合条件的记录。
过滤结果
真正的查询对象灵活性来自于复杂的查询请求。首先,你可以添加一个NSPredicate对象到查询请求中来缩小返回结果的范围。例如,如果你仅仅需要那些firstName是“Trevor”的Employee,你可以直接添加这些谓语:
OBJECTIVE-C
NSString *firstName = @"Trevor";
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"firstName == %@", firstName]];
SWIFT
let firstName = "Trevor"
fetchRequest.predicate = NSPredicate(format: "firstName == %@", firstName)
除了缩小返回对象的范围,你还可以配置这些对象如何返回。例如,你可以指定Core Data返回NSDictionary,而不是NSManagedObject实例。更进一步,你可以设置NSFetchRequest那些NSDictionary实例仅仅Employee上含有的一个属性set。
更多关于NSFetchRequest,可以看这里的类文档。