swift - 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!
非常感谢任何帮助。
解决方案
这是一个非常常见的错误。
占位符%@
仅用于对象,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
并将潜在的错误交给调用者。
推荐阅读
- node.js - 如何使用猫鼬解决慢查询
- java - Images showing in weird colors
- angular - 无法定义服务。工厂缺少类型中的以下属性缺少类型“TypeProvider”中的以下属性
- asp.net - 如何在 IIS 上使用当前构建托管 asp.net webapi 项目
- c - 从左到右添加 2 个大数
- python - Python Youtube 视频上传文件
- google-cloud-firestore - 更新嵌套对象中的某些字段而不用扩展运算符覆盖其他字段
- google-cloud-platform - 为什么我的谷歌云实例经常自行自动关闭
- docker - Set docker toolbox container to receive information sended to host
- python - Is there a way to remove punctuation from Persian text?