创建NSFetchRequest实例,然后对其进行一些必要的配置,再把它传递给contex对象
1.初始化FetchRequest的四中方式
//1根据实体名称创建实体 并用将其赋值给NSFetchRequest的实体
let fetchRequest = NSFetchRequest()
let entity = NSEntityDescription.entityForName("Person",inManagedObjectContext: managedObjectContext)!
fetchRequest.entity = entity
//2直接用实体名称进项初始化
let fetchRequest = NSFetchRequest(entityName: "Person")
//3检索NSManagedObjectModel中的fetchRequest,可以重新设置之前使用过的fetchRequest
let fetchRequest = managedObjectModel.fetchRequestTemplateForName("data")
//4与上面的方法类似,substitutionVariab中的值用来删选request的结果
let fetchRequest = managedObjectModel.fetchRequestFromTemplateWithName("data",substitutionVariables: ["NAME" :"Test"])
2.在CoreData中添加fetchRequest
注:点击加号可以添加筛选条件
//上面的第三种初始化NSFetchRequest的方式,coreDataStack为CoreData(二)中创建的stack。
var fetchRequest: NSFetchRequest!
var persons: [Person]!
let model = coreDataStack.context.persistentStoreCoordinator!.managedObjectModel
fetchRequest = model.fetchRequestTemplateForName("FetchRequest")
do {
//结果保存在persons中
persons = try coreDataStack.context .executeFetchRequest(fetchRequest) as! [Persion]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
3.根据type返回不同的搜索结果
//NSManagedObjectResultType返回模型
//NSCountResultType返回满足要求的结果的个数
//NSDictionaryResultType保存为字典类型
//NSManagedObjectIDResultType返回唯一的标识
//筛选条件。 NSPredicate支持keypath
lazy var PersonPredicate: NSPredicate = {
var predicate =
NSPredicate(format: "person.name == %@", "hehe")
return predicate
}()
let fetchRequest = NSFetchRequest(entityName: "Person")
//.CountResultType类型 返回满足要求的结果的数目
fetchRequest.resultType = .CountResultType
fetchRequest.predicate = PersonPredicate
do {
let results =try coreDataStack.context
.executeFetchRequest(fetchRequest) as! [NSNumber]
} catch let error as NSError {
print("Could not fetch \(error), \(error.userInfo)")
}
}
4.其他的 fetch requests
let fetchRequest = NSFetchRequest(entityName: "Person")
fetchRequest.resultType = .DictionaryResultType
let sumExpression = NSExpressionDescription()
sumExpression.name = "sumAges"
//求和:"sum:"、最小值:"min:"、最大值:"max:"、平均值:"average:"等
sumExpression.expression = NSExpression(forFunction: "sum:",arguments:[NSExpression(forKeyPath: "age")])
sumExpression.expressionResultType = .Integer32AttributeType
fetchRequest.propertiesToFetch = [sumExpression]
do {
let results = try coreDataStack.context.executeFetchRequest(fetchRequest) as! [NSDictionary]
let resultDict = results.first!
} catch let error as NSError {
print("Could not fetch (error), (error.userInfo)")
}
}
//条件判断
lazy var agePredicate: NSPredicate = {
var predicate = NSPredicate(format: "age > 0")
return predicate
}()