2017-12-11 13 views
1

My CoreDataモデルには、同じ抽象親エンティティ "Car"を持つ2つの子エンティティ "CarA"と "CarB"があります。 NSBatchDeleteRequestはすべての子エンティティを削除します

は私だけではなく、すべてのCARAオブジェクトを削除するに deleteObjects("CarA")結果を実行

func deleteObjects(entityName: String) { 
     let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName) 
     let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 
     do { 
      try context.execute(deleteRequest) 
     } catch let error as NSError { 
      print(error) 
     } 
    } 

を使用して、すべてのCARAオブジェクトを削除しようとしているが、また、すべてのCARBは、同様にオブジェクト。

答えて

2

これは私にはバグのようです。あなたがSQLDEBUGを有効にする場合は、全体の親エンティティが削除されたことをコンソール出力から見ることができます:

CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: DELETE FROM ZABSTRACT 
CoreData: sql: COMMIT 

(私の親エンティティは、「抽象」と命名されます)。しかし、私はあなたが述語を追加すると、CoreDataは基礎となるフェッチを修飾して正しい子エンティティに制限することを覚えています。そこで、この問題を回避するには、常に真である述語を追加することです:

fetchRequest.predicate = NSPredicate(value:true) 

と結果のコンソール出力は次のとおりです。

CoreData: sql: BEGIN EXCLUSIVE 
CoreData: sql: DELETE FROM ZABSTRACT WHERE Z_PK IN (SELECT t0.Z_PK FROM ZABSTRACT t0 WHERE t0.Z_ENT = ?) 
CoreData: sql: COMMIT 

それにのみWHERE句を残して、CoreDataも真述語を最適化しそうです正しいエンティティへの削除を制限する。

+0

ありがとう、私のためにそれを解決しました。 – Paul

関連する問題