2017-04-19 16 views
0

coreDataからレコード全体を削除しようとしています。私はデータを取り出し、それを操作用の配列に配置しました(このメソッドを使用してデータを編集できる別の関数があり、それはうまくいきます)。しかし、レコードを単に削除する方法はわかりません。 [.remove(at:index)]は動作せず、以下のコードもどちらも動作しません。私はすべてのフィールドを空にすることができますが、それは私が望むものではありません、私は完全にレコードが消えたい。 私はここでxCode 8/Swift 3&最新のコアデータ構文でコアデータからレコードを削除しようとしています

@IBAction func Delete(_ sender: UIButton) { // The delete function 

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "DestinationsOne") 
    let context = appDelagate.persistentContainer.viewContext 

    var destArray = [DestinationsOne]() // The data array 

    do { 
     try destArray = context.fetch(request) as! [DestinationsOne]} //Fetching the data and placing it in the array 
    catch{ 
     //error message 
    } 
     for index in (0..<destArray.count - 1){ //Go through the records 
      if destArray[index].destID == IDTitle!{ //Picks the record to edit 

      let object = destArray[index] 
        context.delete(object 

} appDelagate.saveContext() }

+0

私はまだこの質問でヘルプを使用できます。ありがとう –

答えて

0

同様の問題のために与えられたソリューションを通じてなく、無駄に行ってきましたあなたのコードといくつかの問題です:

  • がviewContextが読み取り専用として扱われるべきである - あなたコアデータへのすべての変更にperformBackgroundTaskを使用する必要があります
  • すべてのエンティティをフェッチしてからtそれぞれを削除したいものを見つけるために探してください。コアデータに必要なものだけをフェッチするほうがはるかに高速です。これを行うには、述部をフェッチ要求に設定します。
  • フェッチを行い、配列をモデルとして使用してレコードを表示する代わりに、NSFetchedResultsControllerを使用して結果をフェッチして管理することをお勧めします。 fetchedResultsControllerは、オブジェクトが変更、挿入、または削除されたときにデータを同期させて保持します。また、ビューが更新されるように変更があったときに通知するデリゲートメソッドもあります。
  • appDelagate.saveContextをプロジェクトから削除してください。 Appleのテンプレートコードは間違っています。 viewContextに書き込むべきではありませんので、決してそれを保存する必要はありません。
  • IDTitleが設定されていますか?あなたはそれがゼロではないと確信していますか?
  • (マイナー)for index in (0..<destArray.count - 1){は、for (index, element) in destArray.enumerated() {に置き換えて読むことができます。
+0

返信ありがとうございます。あなたの提案のコード例は良いでしょう。私はこれで新しいので、例を取らずに私はそれらを実装する方法を知らない。 IDTitleは、レコードが作成されたときに自動的に設定されるため、ゼロにすることはできません。 –

1

私はこれを考え出しました。私は、ケース内の溶液、この特定のレコードを検索する述語を適用しないのはなぜ誰にも同じ質問

func deleteRecords() -> Void { //The function to delete the record 
        let moc = getContext() 
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "DestinationsOne") 
        let result = try? moc.fetch(fetchRequest) 
        let resultdata = result as! [DestinationsOne] // result as entity 

        for object in resultdata { // Go through the fetched result 
         if object.destID == self.IDTitle{ // If there is a match 
         moc.delete(object) // delete the object 
         } 
        } 
        do { 
         try moc.save() // Save the delete action 
        } catch let error as NSError { 
         print("Could not save \(error), \(error.userInfo)") 
        } catch { 

        } 

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

       deleteRecords() // Call the function 
0

を持っているを投稿しています。巨大なリストをループするよりもはるかに効率的です。

func deleteRecords() { //The function to delete the record 
    let moc = getContext() 
    let fetchRequest = NSFetchRequest<DestinationsOne>(entityName: "DestinationsOne") 
    let predicate = NSPredicate(format: "destID == %@", self.IDTitle) 
    fetchRequest.predicate = predicate 
    do { 
     let resultdata = try moc.fetch(fetchRequest) // no type cast needed 
     if let objectToDelete = resultdata.first { 
      moc.delete(objectToDelete) // delete the object 
      try moc.save() // Save the delete action 
     }   
    } catch { 
     print("Could not save error: ", error) 
    } 
} 
関連する問題