swift - 删除时的核心数据 EXC_BAD_ACCESS
问题描述
从 Core Data 中删除对象时获取 EXC_BAD_ACCESS。任何想法如何解决这个问题?可能需要阅读一些核心数据原则(?)
func deleteEntity(_ entity : String) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
print("Object count: \(context.registeredObjects.count)") // prints 0 here
do {
let results = try context.fetch(fetchRequest)
for managedObject in results {
let managedObjectData : NSManagedObject = managedObject as! NSManagedObject
if !managedObjectData.isDeleted{
context.delete(managedObjectData) // EXC_BAD_ACCESS here, fetch request returns 1 item here!
}
}
try context.save()
} catch let error {
print(error)
}
}
Crashed: com.apple.main-thread
0 CoreData 0x1114c7293 -[NSManagedObjectContext(_NSInternalAdditions) _registerObject:withID:] + 35
1 CoreData 0x1114c5569 -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:] + 217
2 CoreData 0x1114d0512 _PF_FulfillDeferredFault + 882
3 CoreData 0x1114dfe9e _PF_Handler_Primitive_GetProperty + 110
4 CoreData 0x1114dfca3 -[NSManagedObject(_NSInternalMethods) _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 323
5 CoreData 0x1114dfb39 -[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__] + 89
6 CoreData 0x1114dfa2b -[NSManagedObjectContext(_NSInternalChangeProcessing) _establishEventSnapshotsForObject:] + 75
7 CoreData 0x1114f7168 -[NSManagedObjectContext deleteObject:] + 136
编辑:上下文似乎有问题。我也尝试删除整个商店,但似乎保留了一件,导致崩溃。稍后在不同的视图中添加此特定项目。也许这与人际关系有关。-com.apple.CoreData.ConcurrencyDebug 1
使用堆栈跟踪进行调试
也显示
“一个 NSManagedObject 可能只在一个 NSManagedObjectContext 中(或被一个 NSManagedObjectContext 观察)。”
解决方案
删除实体的所有对象的常用方法是
func deleteEntity(_ entity : String) throws {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity)
let results = try context.fetch(fetchRequest)
for managedObject in results {
context.delete(managedObject)
}
try context.save()
}
但是在 iOS 9+、macOS 10.11+ 中有更好的方法
func deleteEntity(_ entity : String) throws {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>)
let persistentStoreCoordinator = context.persistentStoreCoordinator!
try persistentStoreCoordinator.execute(deleteRequest, with: context)
try context.save()
}
推荐阅读
- node.js - 如何将排序功能与 $or 和 $and 一起使用?
- javascript - 当您在 JavaScript Promises 中省略 .catch 时,实际发生了什么?
- javascript - 无法解析为在 Thymeleaf 中定义 DataTable 的表达式
- java - kurento-room-demo 缺少库 org.kurento.module:markerdetector
- python - 列表/Zip 中的“for”
- python - 通过与训练数据的一致映射来分解实时数据?
- kotlin - Kotlin DSL Android Gradle 任务
- javascript - JS:在数组中查找不成对的元素
- python - 在 open(filename, "w") as fp 的 "fp" 中 p 代表什么:
- python - dlib 不使用 CUDA