App委托没有成员persistentStoreCoordinator(从核心数据中删除,swift)

时间:2017-04-17 20:15:03

标签: swift core-data swift3

您好我想从核心数据中删除一行。我能够从表中删除该项,但不能从核心数据中删除。许多地方对这个问题给出了相同的答案。但经过几个小时的努力,看到谷歌搜索结果的前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)
    }
}

我希望有人可以帮助我。提前谢谢。

2 个答案:

答案 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方法。