2012-03-06 25 views
0

私は自分のエンティティにcardIdという名前のプロパティを持っています。
このカードIDは、しばしば自分のエンティティに1回あります。私はこれらの重複を削除したい。coreDataのオブジェクト(類似のオブジェクト/重複)を削除します

これらの重複を見つけて削除するにはどうすればよいですか?

allObjects = [__fetchedResultsController fetchedObjects]; 
for (Entity *inbox in allObjects) { 

    [managedObjectContext deleteObject:**objectToDelete**]; 
} 

どのようにこれらの類似のオブジェクトを見つけることができますか?

答えて

1

以下は単なるアイデアです。あなた自身でそれを詳しく説明しなければなりません。

キー(cardId)をpropertiesToFetchと指定した後、setReturnsDistinctResultsNSFetchRequestであるフェッチから別個の結果のみを返すように指定することができます。だからあなたはすべての別個のオブジェクトの最初のフェッチを行い、結果を可変配列にコピーする。distinctArrayと呼ぶだろう。次に、setReturnsDistinctResultsが無効にされたcompleteArrayですべてのオブジェクトを照会する2番目のフェッチを行います。 distinctArrayの要素を繰り返し、各要素をcompleteArrayから削除します。 completeArrayに残っているものは、削除するオブジェクトになります。

これを低レベルで実装すると(おそらくより効率的です)、サイクルの2倍になります。 objectsToDeleteに削除するすべてのオブジェクトがあるだろう終わり

NSMutableArray* objectsToDelete = [[NSMutableArray alloc] initWithCapacity:how_many_duplicates_you_expect]; 
for (int i = 0; i < [completeArray count]; i++) { 
    for (j = i + 1; j < [completeArray count]; j++) { 
     MOObject* objecti = [completeArray objectAtIndex:i]; 
     MOObject* objectj = [completeArray objectAtIndex:j]; 
     if (objecti.cardId == objectj.cardId) { 
      [objectsToDelete addObject:objectj]; 
     } 
    } 
} 

:あなたはcompleteArrayにのみ、すべてのオブジェクトを取得し、古き良きダブルサイクルを行います。 dbに同じオブジェクトが2回以上出現した場合は、objectsToDeleteにも重複が存在する可能性があるので、削除する前に確認してください。

+2

この回答ありがとうございます。 ObjectToDeleteの代わりにNSMutableArrayを使用する場合は、NSMutableOrderedSetを使用してオブジェクトを繰り返さないようにすると効果的です。次に、配列を繰り返し処理して、その配列内の冗長について心配することなく、すべてのオブジェクトを削除することができます。 – erdekhayser

+0

NSHipsterには、「私の範囲内の素晴らしいもの」が何を示唆しているかについての良い記事があります:http://nshipster.com/nsorderedset/ –

+0

NSMutableOrderedSetを注意して使用してください。同じcardIDを持つ2つの管理オブジェクトがあり、そのエンティティのすべてのオブジェクトをフェッチした場合、フェッチ結果には同じcardIDを持つ2つの異なるオブジェクトが含まれ、セットに2回挿入されます。 MOサブクラスのisEqualメソッドをオーバーライドして、NSMutableOrderedSetを正しく動作させる必要があります。 – MrTJ

関連する問題