我有一个声明为这样的变量:
private var theText = String()
private var aId = String()
然后我做一个获取请求,并希望将其加载到该变量中:
let predicateA = NSPredicate(format: "active == %@", true as CVarArg);
let predicateB = NSPredicate(format: "theId == %@", aId);
let andPredicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [predicateA, predicateB]);
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext;
let requestData = NSFetchRequest<NSFetchRequestResult>(entityName: "DataTable");
requestData.predicate = andPredicate;
do
{
let results = try context.fetch(requestData);
dataactivitiesid = results.first
// let resultset = results as! [NSManagedObject];
/* for data in results
{
// let testyId: Any? = (data as AnyObject).value(forKey: "testyId");
} */
}
catch
{
print("Error in fetching data");
}
我是否需要像上面注释的代码那样遍历结果集,或者因为我知道它只返回一行,所以我可以使用 .first 吗?提前谢谢。
如果你只期望一个项目,你不需要循环。
我建议将first
的结果选择性绑定到一个变量,如果没有找到条目,则可以nil
该变量。
而且您不需要复合谓词,单个谓词可以包含与同一对象相关的多个条件。最后这不是Objective-C,删除尾随分号。
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext;
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "DataTable")
let predicate = NSPredicate(format: "active == TRUE AND theId == %@", aId)
fetchRequest.predicate = predicate
do {
if let result = try context.fetch(fetchRequest).first {
dataactivitiesid = result
}
} catch {
print(error) // print the actual error not a meaningless literal string
}