从Core Data中删除重复的对象

时间:2014-06-02 10:55:36

标签: ios objective-c core-data

我正在使用xmpp框架处理聊天概念。但是我在显示聊天记录时遇到了问题。在核心数据中,重复条目被保存,我无法找到问题。然后我在从Core Data获取数组的同时放置了这个技巧。我在加载数组之前尝试删除重复的条目。

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                   managedObjectContext:moc
                                                                     sectionNameKeyPath:nil
                                                                              cacheName:nil];
NSError *error = nil;

NSMutableArray *mutableFetchResult = [[moc executeFetchRequest:fetchRequest error:&error] mutableCopy];

NSSet *uniqueSet = [NSSet setWithArray:mutableFetchResult];
NSMutableArray *uniqueArray = [NSMutableArray arrayWithArray:[uniqueSet allObjects]];
NSMutableArray *entries = uniqueArray;

但它没有给出正确的数组对象。仍然有重复的对象。删除重复项可能是我做错了什么。请纠正我并给出一些解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以为核心数据实体创建一个类别,该类别可以获取重复副本并编写类似

的内容
+ (Item *)itemWithParsedDictionary:(NSDictionary *)parsedItem inManagedObjectContext:(NSManagedObjectContext *)context
{
    Item *item;
    if (parsedItem) {
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
        request.predicate = [NSPredicate predicateWithFormat:@"name = %@", parsedItem[@"Name"]];
        NSError *error;
        NSArray *matches = [context executeFetchRequest:request error:&error];

        if (!matches || [matches count] > 1) {
            NSLog(@"Multiple copies of unique item detected in the document");
        } else if (![matches count]){
            item = [NSEntityDescription insertNewObjectForEntityForName:@"Item"
                                             inManagedObjectContext:context];

            item.name = parsedItem[@"Name"];
        } else {
            item = [matches lastObject];
        }
    }
return item;
}

关于这方面的优秀课程有一个很好的教训: Stanford University free course CS193p