代码之家  ›  专栏  ›  技术社区  ›  cdub

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

  •  0
  • cdub  · 技术社区  · 8 年前

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

    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");
        }
    

    我是否需要像上面注释的代码那样遍历结果集,或者因为我知道只返回一行,所以我可以使用它。第一提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   vadian    8 年前

    如果只需要一个项目,则不需要循环。

    我建议可选绑定的结果 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
    }