swift - 核心数据 EXC_BAD_ACCESS 删除时

标签 swift core-data nsmanagedobjectcontext

从 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

编辑: 上下文似乎有问题。我也曾尝试移除整个商店,但似乎还剩下一件商品,导致崩溃。这个特定的项目是稍后添加的,在不同的 View 中。可能跟人际关系有关。调试与 -com.apple.CoreData.ConcurrencyDebug 1 堆栈跟踪还显示

“一个 NSManagedObject 只能在一个 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()
}

关于swift - 核心数据 EXC_BAD_ACCESS 删除时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53102721/

相关文章:

ios - 找不到与使用 ASP.NET for ios Swift 的请求 URI Web api 匹配的 HTTP 资源

swift - 如何将嵌入式 json 分配给 Swift 中的变量?

objective-c - 后台线程将 UIImage 返回的结果为零

ios - 核心数据子上下文不预取关系

objective-c - 核心数据查找或创建最有效的方式

objective-c - 取消 NSManagedObjectContext performBlock

ios - 将对象从主队列中的父上下文传递到私有(private)队列中的子上下文

ios - 将子 ManagedObjectContext 所做的更改推送(保存)到其父级时复制实体

ios - CollectionView 没有注册单元格

ios - 拆分字符串以适应大小的算法