2015-09-28 2 views
5

こんにちは、私はNSBatchDeleteRequestで問題が発生しているようですが、関係参照を削除することはできないようです。NSBatchDeleteRequestは関係を削除しません

私は2つのエンティティがあります。

  • ニュース
  • カテゴリーカテゴリは、複数のニュースを持つことができます

を。

NSBatchDeleteRequestを使用してコアデータ内のオブジェクトをすべて削除しようとすると、sqliteファイルを調べると、すべてのカテゴリが削除され、すべてのニュースが削除されているように見えますが、カテゴリとニュースの関係それは失敗を引き起こす。ここで

削除機能:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:entityName]; 
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest]; 
[delete setResultType:NSBatchDeleteResultTypeCount]; 
NSError *error; 
NSBatchDeleteResult *results = [deleteContext executeRequest:delete error:&error]; 

この問題を解決する方法上の任意のアイデア?

+0

どのような削除ルールをお使いですか? – Shizam

+0

@Shizam Nullifyを使用しています – Serluca

+0

レコード数はいくつですか?10.000未満ですか?オブジェクトグラフを使用することもできます。 – Mundi

答えて

4

shouldDeleteInaccessibleFaults:YESに設定し、アクセスできない/できないフォルトを削除します。これはすぐに問題を解決します。

コアデータの新機能WWDC 2015セッションではこれについて少し話します。 NSBatchDeleteRequestNSBatchUpdateRequestの両方は、NSManagedObjectContextの参加なしで永続ストアを変更します。その結果、データのコンテキストのビューはストアと矛盾します。

削除されたオブジェクトのメモリ内コピーは、NSManagedObjectContextで更新する必要があります。削除されたオブジェクトのオブジェクトIDをバッチ削除要求で返し、それらのIDをリフレッシュするようにNSManagedObjectContextに指示します。これは次のようになります

[managedObjectContext performBlock:^{ 
    NSBatchDeleteRequest batchDeleteRequest = [NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest]; 
    NSBatchDeleteResult  result    = nil; 

    result = [managedObjectContext executeRequest:batchDeleteRequest error:&error]; 

    if ([[result result] count] > 0){ 
     [managedObjectContext performBlock:^{ 
      NSArray<NSManagedObjectID *> *objectIDs = (NSArray<NSManagedObjectID *>)[result result]; 
      [objectIDs enumerateObjectsUsingBlock:^(NSManagedObjectID *objID, NSUInteger idx, BOOL *stop) { 
       NSError *error = nil; 
       NSManagedObject *obj = [managedObjectContext existingObjectWithID:objID error:&error]; 
       if (![obj isFault]) { 
        [managedObjectContext refreshObject:obj mergeChanges:YES]; 
       } 
      }]; 
     }]; 
    } 
}]; 

バッチが実行を削除

は、関係が削除または無効化が、削除規則のカスケードセットが実行されない場合があり、および検証ルールは実行されませんされますバッチ変更要求のいずれかを使用する場合は、データの整合性を保証することはアプリケーションの責任です。

データモデルでは、関連オブジェクトが孤立していても見つけられないように、複数の削除要求を発行する必要があります。たとえば、空のリレーションシップを持つ以前に関連したエンティティを見つけるには、2回目のバッチ削除が必要な場合があります。など

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"[email protected] == 0"];

または副問合せを使用することができ、

+0

こんにちは@quellishは残念ながらうまくいきません、私はdeleteバッチの後のコンテキストでrefreshAllObjectsを呼び出すオブジェクトをリフレッシュしています。私は、アプリケーション次第です知っているが、私は両方のエンティティを削除した場合、私はそれを設定する必要があると思われる関係 – Serluca

+0

を削除するには、その後の参照を持っていない: 'batchDeleteRequest.resultType = NSBatchDeleteResultTypeObjectIDs' これが機能するためには、そうでない場合result.resultのデフォルトはstatusです(成功/失敗)。 –

0

私は最善の解決策は、このように無効化し、最初のオブジェクトグラフ内のカテゴリを削除するかもしれないと思う。そのような要求がどのように見えるかもしれための述語すべての関係。

その後、NSBatchDeleteRequestのニュース項目に進むことができます。

3

おそらくできます[manageObjectContext reset];

関連する問題