删除核心数据中的对象(类似对象/副本)
问题描述:
我在我的实体中有一个名为cardId的属性。
有时候,这个cardId在我的实体中多于一次。我想删除这些重复项。删除核心数据中的对象(类似对象/副本)
如何找到这些重复项并删除它们?
allObjects = [__fetchedResultsController fetchedObjects];
for (Entity *inbox in allObjects) {
[managedObjectContext deleteObject:**objectToDelete**];
}
我怎样才能找到这些相似的对象?
答
以下只是一个想法,您必须亲自阐述。
指定您的密钥(cardId)为propertiesToFetch
后,您可以指定只返回NSFetchRequest
的setReturnsDistinctResults
的提取的不同结果。因此,您首先获取所有不同的对象,然后将结果复制到可变数组中,我将称其为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
中也可能有重复,因此请在删除之前对其进行检查。
感谢您的回答。如果不是objectsToDelete是一个NSMutableArray,而是使它成为一个NSMutableOrderedSet,这样对象就不会重复了。然后你可以遍历数组并删除所有对象,而不用担心该数组中的模糊。 – erdekhayser 2013-10-18 22:12:51
NSHipster有一个很好的文章,“我对范围真棒”的建议是:http://nshipster.com/nsorderedset/ – 2013-11-12 02:00:56
小心使用NSMutableOrderedSet。如果您有两个具有相同cardID的托管对象,并且您为其实体获取所有对象,则获取结果将包含两个具有相同cardID的_different_对象,并且它们将在该集合中插入两次。您应该重写MO子类中的isEqual方法,以使NSMutableOrderedSet正常工作。 – MrTJ 2013-11-13 09:40:45