【问题标题】:'NSBatchDeleteRequest' is only available on iOS 9.0 or newer'NSBatchDeleteRequest' 仅适用于 iOS 9.0 或更高版本
【发布时间】:2018-06-22 11:59:13
【问题描述】:

我遇到了这个问题

“NSBatchDeleteRequest”仅适用于 iOS 9.0 或更高版本

class func delete(placeId:Int64) {
        let context = CoreDataStack.getContext()
        let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Place")
        fetch.predicate = NSPredicate(format: "id = \(placeId)")
        let request = NSBatchDeleteRequest(fetchRequest: fetch)

        do {
            _ = try context.execute(request)
        } catch {
            fatalError("Failed to execute request: \(error)")
        }
        CoreDataStack.saveContext()
    }

在 iOS 9 之前用于相同功能的代码是什么?

【问题讨论】:

    标签: ios swift core-data nsbatchdeleterequest


    【解决方案1】:

    只是一个循环,获取记录并删除它们

    let context = CoreDataStack.getContext()
    let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Place")
    fetch.predicate = NSPredicate(format: "id = \(placeId)")
    let fetchResults = try context.fetch(request)
    for anItem in fetchResults {
        context.delete(anItem)
    }
    

    您可以添加此if 子句以考虑两种方式

    if #available(iOS 9, macOS 10.11, *) {
    

    【讨论】:

      【解决方案2】:

      在 iOS 9 之前,您必须获取实体的每条记录并将其标记为删除,然后保存更改。

      类似这样的:

      context.performBlockAndWait
      {
      
        if let result = try? context.fetch(fetch) 
        {
           for object in result
           {
              context.delete(object)
           } 
        }
      
        do 
        {
          // After mark to delete you must save the context
          try context.save()
        } 
        catch 
        {
          // Error
        }
      
      }
      

      感谢 user1046037 的帮助。

      【讨论】:

      • 请将所有托管对象操作封装在context.performAndWait/context.perform
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2018-07-04
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多