由于FOR循环,从数据库中获取核心数据失败

时间:2017-12-01 13:17:29

标签: ios swift core-data

我试图在null开始时从核心数据中的一个属性中检索除viewController之外的所有值。但是在for循环期间,no始终取值0并且不会提前递增。所以我的results.count是8,然后它显示0 8次,并为该属性获取相同的值。

func searchMark() -> Int
{
    do
    {
        let mngdCntxt = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AddedBookmark")
        let results = try mngdCntxt.fetch(fetchRequest)
        //fetchRequest.returnsObjectsAsFaults = false

        for no in 0..<results.count{

          if let match = results[no] as? AddedBookmark
             {
                  print(no)
                  let providerNo = match.value(forKey: "providerNo") as! Int
                  print("providerNo: \(providerNo)")
                  return providerNo
           } 
    }
    catch{}
    return 0
}

通过providerNo循环获取for的值。

2 个答案:

答案 0 :(得分:1)

你回来太快,所以循环甚至没有递增一次(这也是no == results.count时循环不会崩溃的原因:

func searchMark() -> Int {
    var output = 0
    do {
        let mngdCntxt = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AddedBookmark")
        let results = try mngdCntxt.fetch(fetchRequest)

        for no in 0...(results.count-1) {
           if let match = results[no] as? AddedBookmark {
                print(no)
                let providerNo = match.value(forKey: "providerNo") as! Int
                print("providerNo: \(providerNo)")
                output = providerNo
           }
        } 
        return output
    }
    catch{}
    return output
}

此功能可能与您的预期完全不同,但它会显示循环应该有多大以及何时返回

答案 1 :(得分:0)

如果你

  

尝试从一个属性中检索除null之外的所有值

这意味着您实际上想要返回Int 数组,并且您的强制解包属性意味着该属性被声明为非可选属性。根据这两个假设null意味着0

逻辑结论是指定谓词以返回providerNo != 0的所有记录,将项目映射到providerNo值并返回该值。

func searchMark() -> [Int]
{
    do {
        let mngdCntxt = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "AddedBookmark")
        fetchRequest.predicate = NSPredicate(format: "providerNo != 0")
        let results = try mngdCntxt.fetch(fetchRequest) as! [AddedBookmark]
        return results.map{ Int($0.providerNo) }
    }
    catch {
        print(error)
        return [Int]()
    }
}