【问题标题】:Empty Core Data Table空核心数据表
【发布时间】:2019-12-27 11:10:34
【问题描述】:

我想从选定的核心数据实体中删除所有数据。我正在使用以下代码,但出现以下错误:

未解析的标识符 managedObjectContext

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
   try managedObjectContext.executeRequest(batchDeleteRequest)
} catch {
   // Error Handling
}

【问题讨论】:

    标签: swift xcode core-data


    【解决方案1】:

    首先——正如其他答案中已经提到的——你必须从AppDelegate获得NSManagedObjectContext

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedObjectContext = appDelegate.persistentContainer.viewContext 
    

    强制解包非常好,如果缺少AppDelegate,应用程序甚至都不会启动。

    但有一点需要注意:

    如果您在托管对象上下文中调用 execute,则必须将更改合并到上下文中,因为 执行 操作不会修改上下文的内容。

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    batchDeleteRequest.resultType = .resultTypeObjectIDs
    
    do {
        let result = try managedObjectContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
        let changes = [NSDeletedObjectsKey : result.result as! [NSManagedObjectID]]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedObjectContext])
    } catch {
        print(error)
    }
    

    但是,如果您在持久存储协调器上调用 execute,则可以避免 merge 步骤

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    
    do {
        let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator!
        try persistentStoreCoordinator.execute(batchDeleteRequest, with: managedObjectContext)        
    } catch {
        print(error)
    }
    

    【讨论】:

      【解决方案2】:

      似乎您还没有声明您的 managedObjectCotext 并尝试访问它。试试这个:

      let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
      let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
      do {
         try managedObjectContext.executeRequest(batchDeleteRequest)
      } catch {
         // Error Handling
      }
      

      【讨论】:

        【解决方案3】:

        由于您的错误,您没有从 appDelegate 中的容器声明上下文。你可以试试下面的代码:

            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        
            //We need to create a context from this container
            let managedObjectContext = appDelegate.persistentContainer.viewContext 
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
            let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        
            do {
                 try managedObjectContext.executeRequest(batchDeleteRequest)
            } catch {
                 // Error Handling
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-24
          • 2011-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-24
          相关资源
          最近更新 更多