【问题标题】:Application crashes when executing NSBatchDeleteRequest with "Unknown Command Type <NSBatchDeleteRequest,..>"使用“未知命令类型 <NSBatchDeleteRequest,..>”执行 NSBatchDeleteRequest 时应用程序崩溃
【发布时间】:2016-03-18 06:29:13
【问题描述】:

我正在编写一个 OS X 应用程序,它需要能够删除其核心数据存储中保存的所有“SongEntity”实例。 但是,当我尝试执行 NSBatchDeleteRequest 时,我的应用程序崩溃,并出现以下控制台输出(摘录):

未知的命令类型(实体:SongEntity;谓词: ((空值));排序描述符:((空));类型: NSManagedObjectIDResultType; ) >

这是我的实现:

func clearStore()
{
    let fetchRequest = NSFetchRequest(entityName: "SongEntity")
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    do
    {
        try managedObjectContext.executeRequest(deleteRequest)
    }
    catch
    {
        fatalError("Not able to perform operation: \(error)")
    }
    managedObjectContext.reset()
}

任何帮助将不胜感激

编辑: 事实证明,这个问题与所选的商店类型有关: 来自班级NSBatchDeleteRequest

//  May not be supported by all store types.

我尝试将 store-type 从 NSXMLStoreType(macOS 模板默认)更改为 NSSQLiteStoreType,现在它可以工作了。

【问题讨论】:

  • “在某些情况下”? – 注意帽子 NSBatchDeleteRequest 需要 iOS 9。
  • 我删除了那个措辞(谢谢)。所以 NSBatchDeleteRequest 在 OS X 上不可用...?从El Capitan Release Note 我了解到,El Capitan 支持 NSBatchDeleteRequest
  • 抱歉,我忽略了 [osx] 标签。我不知道它是否在 OS X 上可用(以及从什么时候开始)。

标签: swift macos core-data


【解决方案1】:

我在持久存储上使用 NSInMemoryStoreType 也遇到了这个问题。事实证明,并非所有存储类型都支持批量删除,因此我不得不切换到使用 fetch 请求,并简单地迭代托管对象并一个一个地删除它们。

【讨论】:

    【解决方案2】:

    NSBatchDeleteRequest 在持久存储协调器上执行,而不是托管对象上下文。

    try persistentStoreCoordinator.executeFetchRequest(
        batchDeleteRequest, withContext:context
    )
    

    【讨论】:

    • 对于 OS X,它只是 executeRequest 没有获取。但是,即使我在persistentStoreCoordinator 上执行请求,我也遇到了所描述的问题。有任何想法吗? ://
    • 您指的是 Swift 3。这是一个较旧的答案。
    • 对不起。认为这是 iOS / Mac 的区别,而不是 Swift 2 / Swift 3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多