首页 > 解决方案 > NS谓词 | 在实体获取请求上给出错误的异常 | 斯威夫特 4

问题描述

我尝试通过 CoreData 模型中的 NSPredicate 获取实体。最初我使用它插入一个实体id,现在打算得到它。但是,我的代码在没有任何进一步描述的情况下崩溃,特别是我的NSPredicate. 我不知道为什么?我的id属性是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!

非常感谢任何帮助。

标签: swiftcore-datanspredicate

解决方案


这是一个非常常见的错误。

占位符%@仅用于对象,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并将潜在的错误交给调用者。


推荐阅读