您好我想从核心数据中删除一行。我能够从表中删除该项,但不能从核心数据中删除。许多地方对这个问题给出了相同的答案。但经过几个小时的努力,看到谷歌搜索结果的前20页的所有链接,它仍然无法正常工作。
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
foodItems.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
}
let delegate = UIApplication.shared.delegate as! AppDelegate
let managedObjectContext = delegate.persistentContainer.viewContext
let coord = delegate.persistentStoreCoordinator // App delegate has no member persistentStoreCoordinator
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ProductName")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try coord.executeRequest(deleteRequest, withContext: managedObjectContext)
} catch let error as NSError {
debugPrint(error)
}
}
我希望有人可以帮助我。提前谢谢。
答案 0 :(得分:0)
文档告诉您如何更新内存中的对象:https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
确保在执行请求之前将NSBatchDeleteRequest的resultType设置为NSBatchDeleteRequestResultType.resultTypeObjectIDs。
do {
let result = try moc.execute(request) as? NSBatchDeleteResult
let objectIDArray = result?.result as? [NSManagedObjectID]
let changes = [NSDeletedObjectsKey : objectIDArray]
NSManagedObjectContext.mergeChangesFromRemoteContextSave(changes, [moc])
} catch {
fatalError("Failed to perform batch update: \(error)")
}
答案 1 :(得分:0)
这里有一些事情发生。您想要删除条目。您需要已经获得的托管对象上下文:
let managedObjectContext = delegate.persistentContainer.viewContext
然后,您似乎正在尝试获取您不需要的NSPersistentStoreCoordinator
,这会导致您的错误消息:
let coord = delegate.persistentStoreCoordinator // App delegate has no member persistentStoreCoordinator
您收到此错误消息是因为您的应用代表没有名为persistentStoreCoordinator
的属性。它与错误信息的发音完全一样明显。
我不完全确定您为什么要尝试获得持久存储协调员 - 可能是因为即使您只是想要删除,您也会尝试使用批量删除请求一行:
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "ProductName")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
如果您运行该请求并且成功,则会删除 ProductName
的每个实例,而不仅仅是一行。您没有告诉过滤对象的请求,只找到一个(或几个)。相反,您已经设置了批量请求,该请求将命中每个实例而不是所选行。
您可以通过添加谓词来修复批处理请求,但这是删除单行的一种非常不寻常的方法。通常,您获取一堆托管对象,如果要删除一个托管对象,则告诉托管对象删除该对象。不需要对单个对象进行批量请求。
如果您的foodItems
数组包含NSManagedObject
(或NSManagedObject
的子类)的实例,则更好的方法是使用具有delete
的托管对象上下文方法。获取foodItems[indexPath.row]
处的对象,并将其直接传递给delete
方法。