2017-04-17 8 views
0

こんにちはコアデータから行を削除します。テーブルからアイテムを削除できましたが、コアデータは削除できませんでした。多くの場所がこの質問に同じ答えを与えます。しかし、何時間も苦労して、Google検索結果の最初の20ページからすべてのリンクを見ると、それはまだ動作していません。アプリケーションデリゲートにはメンバーがありませんpersistentStoreCoordinator(コアデータから削除、即時)

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == UITableViewCellEditingStyle.delete { 
     foodItems.remove(at: indexPath.row) 
     tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic) 
    } 
    let delegate = UIApplication.shared.delegate as! AppDelegate 
    let managedObjectContext = delegate.persistentContainer.viewContext 
    let coord = delegate.persistentStoreCoordinator // App delegate has no member persistentStoreCoordinator 

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

    do { 
     try coord.executeRequest(deleteRequest, withContext: managedObjectContext) 
    } catch let error as NSError { 
     debugPrint(error) 
    } 
} 

誰かが私を助けてくれることを願っています。前もって感謝します。

+0

申し訳ありませんが、私は答えを変更しました。バッチ削除を保存する必要はありません。しかし、メモリ内のオブジェクトをリロードする必要があります。これは、フェッチ要求が正しいことを前提としています。 –

答えて

0

ドキュメントはあなたのメモリ内のオブジェクトを更新する方法を教えて:https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html

要求が実行される前にNSBatchDeleteRequestのresultTypeとはNSBatchDeleteRequestResultType.resultTypeObjectIDsに設定されていることを確認してください。

do { 
    let result = try moc.execute(request) as? NSBatchDeleteResult 
    let objectIDArray = result?.result as? [NSManagedObjectID] 
    let changes = [NSDeletedObjectsKey : objectIDArray] 
    NSManagedObjectContext.mergeChangesFromRemoteContextSave(changes, [moc]) 
} catch { 
    fatalError("Failed to perform batch update: \(error)") 
} 
+0

どこ?どうして?どのようにエラーを解決するのだろうか? –

+0

CoreDataでは、コンテキストには行を表すメモリ内オブジェクトがあります。バッチ削除を実行すると、そのオブジェクトは元のストアに直接移動します(コンテキストは変更されません)。オブジェクトのIDを取得し、コンテキストから削除するようにコンテキストを指示する必要があります。また、管理対象オブジェクトへの参照がある場合は、それらが削除されているかどうかを確認する必要があります。どこ? executeRequestの後に –

0

ここで起こっていくつかあります。エントリを削除したいとします。あなたは既に取得している管理対象オブジェクトコンテキストを、必要とする:

let managedObjectContext = delegate.persistentContainer.viewContext 

あなたは、あなたが必要としないNSPersistentStoreCoordinatorを取得しようとし、そしてそのあなたのエラーメッセージが表示されているように見える:

let coord = delegate.persistentStoreCoordinator // App delegate has no member persistentStoreCoordinator 

あなたのアプリケーションデリゲートにpersistentStoreCoordinatorという名前のプロパティがないため、このエラーメッセージが表示されます。エラーメッセージの音と同じくらい明確です。

永続的なストアコーディネータを取得しようとしている理由を完全にはわかりません。おそらく、単一の行を削除したいといっても、バッチ削除リクエストを使用しようとしているからです。

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

あなたがその要求を実行し、それが成功した場合、あなたはProductNameのすべてのインスタンスだけでなく、1行を削除します。オブジェクトをフィルタリングして1つ(または少数)しか見つからないという要求はありません。代わりに、選択した行の代わりにすべての単一のインスタンスにヒットするバッチ要求を設定しました。

述部を追加してバッチ要求を修正することはできますが、これは非常に特殊な1行の削除方法です。一般的には、管理オブジェクトの束をフェッチします。削除する場合は、そのオブジェクトを削除するよう管理対象オブジェクトに指示します。 1つのオブジェクトに対してバッチ要求を行う必要はありません。

あなたfoodItems配列がNSManagedObjectのインスタンス(またはNSManagedObjectのサブクラス)が含まれている場合、より良いアプローチはdelete方法を持っている、管理対象オブジェクトコンテキストを使用することです。オブジェクトをfoodItems[indexPath.row]に取得し、直接deleteメソッドに渡します。

関連する問題