NSPredicate |在实体获取请求|Swift 4上出现错误异常



我试图通过CoreData模型中的NSPredcate获取实体。最初,我使用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!

非常感谢您的帮助。

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

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

相关内容

最新更新