web-dev-qa-db-ja.com

Swift 3コアデータ削除オブジェクト

残念ながら、新しいCore Dataのセマンティクスに夢中になります。以前の質問には、ヘッダーファイルの自動生成が正しくないために機能しないクリーンなコードがありました。今、オブジェクトを削除する作業を続けています。私のコードは非常にシンプルなようです:

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)
} 

print(object)の代わりにcontext.delete(object)を使用して「ハード」デバッグを行ったところ、正しいオブジェクトが表示されました。削除するだけです。

追伸deleteObjectはありません。 NSManagedContextにはpublic func delete(_ sender: AnyObject?)しかありません

47
user6485277

フェッチの結果は、管理対象オブジェクトのarrayです。この場合は[Event]であるため、配列を列挙して、一致するすべてのオブジェクトを削除できます。例(フェッチエラーの場合のクラッシュを避けるためにtry?の代わりにtry!を使用):

if let result = try? context.fetch(fetchRequest) {
    for object in result {
        context.delete(object)
    }
}

一致するオブジェクトが存在しない場合、フェッチは成功しますが、結果の配列は空です。


注:コードでは、objectの型は[Event]であるため、

context.delete(object)

コンパイラは、への呼び出しを作成します

public func delete(_ sender: AnyObject?)

予想される代わりにNSObjectのメソッド

public func delete(_ object: NSManagedObject)

NSManagedObjectContextのメソッド。そのため、コードはコンパイルされますが、実行時に失敗します。

70
Martin R

ここでのコツは、オブジェクトを削除した後にコンテキストを保存することです。

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
}

これが誰かを助けることを願っています。

41
J. Lopes

コアデータオブジェクトの削除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
} 
18
Raj Joshi
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")
    }
}
10
Hitesh Chauhan

Swift 4.1および4.2

     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")
     }
4
GSK

エンティティに文字列を使用しないSwift 4

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")

do {
    let objects = try context.fetch(fetchRequest)
    for object in objects {
        context.delete(object)
    }
    try context.save()
} catch _ {
    // error handling
}
3
Sonius

NS

それは私にそれらをロードせずに一度に複数のオブジェクトで削除操作を実行できます

fileprivate func deleteRecords(){
        debugPrint("Before","Making")
//Here UserNotification class is NSManagedObject Class.
        let request =  UserNotification.fetchRequest() as NSFetchRequest<UserNotification>

        let context = helper.persistentContainer.viewContext
        do{
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>)

            do{
                try context.execute(deleteRequest)
                debugPrint("Batch deleted")
            }
        }catch let error as NSError {
                debugPrint("Error",error)
        }
    }
0
nikhil nangia

Swift 5、4.2のクエリでコアデータオブジェクトを削除

let fetchrequest = NSFetchRequest<Your_Model>(entityName: "Your_Entity_Name")
fetchrequest.predicate = NSPredicate(format: "any your_key == %d", your_value)

これが誰かに役立つことを願って

0
Chanaka Caldera

コアデータからオブジェクトを削除する

let entity = NSEntityDescription.entity(forEntityName: "Students", in: managedContext)
        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = entity
        if let result = try? managedContext.fetch(request) {
            for object in result {
                managedContext.delete(object as! NSManagedObject)
            }
            txtName.text = ""
            txtPhone.text = ""
            txt_Address.text = ""
            labelStatus.text = "Deleted"

        }
0
CSE 1994