2012-03-06 113 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

相关问题