加载核心数据提取请求的结果集



我有一个声明为这样的变量:

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
}