代码之家  ›  专栏  ›  技术社区  ›  Mohsin Khubaib Ahmed

nspredicate对实体提取请求swift 4给出错误异常

  •  0
  • Mohsin Khubaib Ahmed  · 技术社区  · 6 年前

    我尝试通过coredata模型中的nspredicate获取实体。最初,我使用 id 现在就打算得到它。但是,我的代码崩溃,没有任何进一步的描述 NSPredicate . 我不知道为什么?我的 身份证件 属性是 Int32 :

            var employTime:EmployeeTime?
            let context = getContext()
            let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "EmployeeTime")
    
            //code crashes on this bottom line
            let predicate = NSPredicate(format: "id == %@", id)
            fetchRequest.predicate = predicate
            let employTimes = try! context.fetch(fetchRequest) as? [EmployeeTime]
            if (employTimes?.count)! > 0 {
                for et in employTimes! {
                    if et.id == id {
                        employTime = et
                    }
                }
            } else {
                employTime = EmployeeTime(context: context)
            }
            return employTime!
    

    任何帮助都非常感谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   vadian    6 年前

    这是一个很常见的错误。

    占位符 %@ 仅用于对象,用于 Int32 你需要 %d %i

    let predicate = NSPredicate(format: "id == %d", id)
    

    并用具体的 NSManagedObject 子类

    let fetchRequest = NSFetchRequest<EmployeeTime>(entityName: "EmployeeTime")
    

    这避免了稍后的类型转换。


    可以简化整个代码(不需要选项):

    let employTime:EmployeeTime
    let context = getContext()
    let fetchRequest = NSFetchRequest<EmployeeTime>(entityName: "EmployeeTime")
    let predicate = NSPredicate(format: "id == %d", id)
    fetchRequest.predicate = predicate
    let employTimes = try! context.fetch(fetchRequest)
    if let et = employTimes.first {
       employTime = et
    } else {
       employTime = EmployeeTime(context: context)
    }
    return employTime
    

    但是你应该避免 try! . 发挥你的作用 throw 并将潜在错误移交给调用者。