2012-03-06 131 views
0

我在我的實體中有一個名爲cardId的屬性。
有時候,這個cardId在我的實體中多於一次。我想刪除這些重複項。刪除核心數據中的對象(類似對象/副本)

如何找到這些重複項並刪除它們?

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

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

我怎樣才能找到這些相似的對象?

回答

1

以下只是一個想法,您必須親自闡述。

指定您的密鑰(cardId)爲propertiesToFetch後,您可以指定只返回NSFetchRequestsetReturnsDistinctResults的提取的不同結果。因此,您首先獲取所有不同的對象,然後將結果複製到可變數組中,我將稱其爲distinctArray。然後,您在查詢所有對象的位置進行第二次提取,因此setReturnsDistinctResults已禁用到completeArray。您遍歷distinctArray的元素並從completeArray中刪除每個元素。 completeArray中剩下的將是要刪除的對象。

這個更低層次的實現(可能更高效)將是循環的兩倍。您在取只completeArray所有對象和做舊的好雙循環:

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]; 
     } 
    } 
} 

在年底將有中objectsToDelete被刪除的所有對象。請注意,如果您的數據庫中有多於兩個同一對象,那麼即使在objectsToDelete中也可能有重複,因此請在刪除之前對其進行檢查。

+2

感謝您的回答。如果不是objectsToDelete是一個NSMutableArray,而是使它成爲一個NSMutableOrderedSet,這樣對象就不會重複了。然後你可以遍歷數組並刪除所有對象,而不用擔心該數組中的模糊。 – erdekhayser 2013-10-18 22:12:51

+0

NSHipster有一個很好的文章,「我對範圍真棒」的建議是:http://nshipster.com/nsorderedset/ – 2013-11-12 02:00:56

+0

小心使用NSMutableOrderedSet。如果您有兩個具有相同cardID的託管對象,並且您爲其實體獲取所有對象,則獲取結果將包含兩個具有相同cardID的_different_對象,並且它們將在該集合中插入兩次。您應該重寫MO子類中的isEqual方法,以使NSMutableOrderedSet正常工作。 – MrTJ 2013-11-13 09:40:45

相關問題