我有一个声明的变量:
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吗?提前谢谢。
答案 0 :(得分:2)
如果您只想要一个项目,则不需要循环。
我建议将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
}