Swift 3核心数据删除对象

50 xcode core-data ios swift3

不幸的是,新的核心数据语义让我发疯.我之前的问题有一个干净的代码,由于头文件的自动生成不正确而无效.现在我继续我的工作删除对象.我的代码似乎很简单:

func deleteProfile(withID: Int) {
    let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
    fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")
    let object = try! context.fetch(fetchRequest)
    context.delete(object)
} 
Run Code Online (Sandbox Code Playgroud)

我做了一个"硬"调试print(object)而不是context.delete(object)它,它向我展示了正确的对象.所以我只需删除它.

PS没有deleteObject.现在NSManagedContext只有public func delete(_ sender: AnyObject?)

Mar*_*n R 76

在您的情况下,获取的结果是一个托管对象 数组[Event],因此您可以枚举数组并删除所有匹配的对象.示例(在获取错误的情况下使用try?而不是try!避免崩溃):

if let result = try? context.fetch(fetchRequest) {
    for object in result {
        context.delete(object)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不存在匹配的对象,则获取成功,但结果数组为空.


注意:在您的代码中,object具有类型[Event],因此具有

context.delete(object)
Run Code Online (Sandbox Code Playgroud)

编译器创建一个调用

public func delete(_ sender: AnyObject?)
Run Code Online (Sandbox Code Playgroud)

的方法NSObject而不是预期的

public func delete(_ object: NSManagedObject)
Run Code Online (Sandbox Code Playgroud)

的方法NSManagedObjectContext.这就是您的代码编译但在运行时失败的原因.

  • 不要忘记在另一个答案中提到调用`try context.save()`. (17认同)
  • @Jack:当然,您最终必须保存上下文以使更改永久化。 (2认同)

J. *_*pes 43

这里的诀窍是删除对象后保存上下文.

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")
let objects = try! context.fetch(fetchRequest)
for obj in objects {
    context.delete(obj)
}

do {
    try context.save() // <- remember to put this :)
} catch {
    // Do something... fatalerror
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人.

  • 得到错误: - `不能将'[Entity]'类型的值转换为`context.delete(object)行上的预期参数类型'NSManagedObject'` (4认同)

Raj*_*shi 18

删除核心数据对象swift 3

// MARK: Delete Data Records

func deleteRecords() -> Void {
    let moc = getContext()
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")

     let result = try? moc.fetch(fetchRequest)
        let resultData = result as! [Person]

        for object in resultData {
            moc.delete(object)
        }

        do {
            try moc.save()
            print("saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {

        }

}

// MARK: Get Context

func getContext () -> NSManagedObjectContext {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext
} 
Run Code Online (Sandbox Code Playgroud)


小智 14

func deleteRecords() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "nameofentity")
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

    do {
        try context.execute(deleteRequest)
        try context.save()
    } catch {
        print ("There was an error")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这比这里的大多数答案要好!&gt;“请求Core Data批量删除持久性存储中的数据,而不将任何数据加载到内存中。” (2认同)
  • @Firo这实际上是最好的答案,除非您需要像10.11 NSBatchDeleteRequest之前一样编写在10.11之前运行的代码。在任何其他情况下,这将使CoreData直接删除数据库中的数据,跳过所有首先加载任何数据的处理,并跳过获取后用于存储数据的任何内存使用情况。 (2认同)

Gur*_*ngh 5

Swift 4.1、4.2和5.0

     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     let context = appDelegate.persistentContainer.viewContext
     let requestDel = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
     requestDel.returnsObjectsAsFaults = false
  // If you want to delete data on basis of some condition then you can use NSPredicate
  //  let predicateDel = NSPredicate(format: "age > %d", argumentArray: [10])
  // requestDel.predicate = predicateDel


     do {
          let arrUsrObj = try context.fetch(requestDel)
          for usrObj in arrUsrObj as! [NSManagedObject] { // Fetching Object
              context.delete(usrObj) // Deleting Object
         }
     } catch {
          print("Failed")
     }

    // Saving the Delete operation
     do {
         try context.save()
     } catch {
         print("Failed saving")
     }
Run Code Online (Sandbox Code Playgroud)