如何判断CoreData中是否存在指定参数的实体?
问题解决:CoreData查询崩溃(无实体时无法执行获取请求)
崩溃原因是你创建的NSFetchRequest没有正确关联对应的CoreData实体,CoreData无法识别要查询的目标实体,因此抛出错误。
修正后的代码(推荐写法)
利用CoreData实体类自动生成的fetchRequest()方法,这种方式类型安全,能避免实体名称拼写错误:
func isThereFlashCardAccData(cardName: String) -> Bool { let fR = FlashCardAccuracy.fetchRequest() fR.predicate = NSPredicate(format: "cardName == %@", cardName) do { let count = try viewContext.count(for: fR) return count > 0 } catch let error as NSError { print("Error: \(error.localizedDescription)") return false } }
另一种手动指定实体的写法
如果需要手动指定实体名称,注意名称必须和CoreData模型文件(.xcdatamodeld)中的实体名称完全一致(大小写敏感):
func isThereFlashCardAccData(cardName: String) -> Bool { let fR = NSFetchRequest<FlashCardAccuracy>(entityName: "FlashCardAccuracy") fR.predicate = NSPredicate(format: "cardName == %@", cardName) do { let count = try viewContext.count(for: fR) return count > 0 } catch let error as NSError { print("Error: \(error.localizedDescription)") return false } }
额外注意事项
- 确保
FlashCardAccuracy是CoreData自动生成的实体类,或你手动创建的类已正确关联模型中的实体 - 即使实体中没有数据,只要请求正确关联实体,
count(for:)会返回0,不会崩溃
内容的提问来源于stack exchange,提问作者mzm0227
相关产品推荐
相关产品推荐

