在核心数据中查找重复值

时间:2014-02-05 03:48:56

标签: ios iphone core-data ios7 core-data-migration

我正在通过核心数据将新对象插入数据库。有什么方法可以在我插入值之前检查数据库中是否有任何重复?

AccountDetails * newEntry = [NSEntityDescription insertNewObjectForEntityForName:@"AccountDetails" inManagedObjectContext:self.managedObjectContext];   
newEntry.acc_date=date;
newEntry.bank_id=bank_id1;
NSError *error;
    if (![self.managedObjectContext save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        }       
   [self.view endEditing:YES];

每次我运行应用程序时,它会再次重新插入值。我想检查是否有任何新的类别,如果有,那么我将只添加新的类别。

提前感谢..

2 个答案:

答案 0 :(得分:7)

你可以取,或者你可以数。计数比获取快得多。取决于你想要做什么。

如果您只想插入新副本并跳过重复项,请使用-[NSManagedObjectContext countForFetchRequest: error:]确定对象是否存在。

您可以预先构建谓词,只需替换每个循环上的唯一值,这样即使谓词的成本也很低。这是相当高效的,但不是最好的解决方案,因为它会在每个循环中击中磁盘。

另一种选择是将获取更改为:

  • 只是唯一值
  • NSDictionary结果

然后将所有的可插入数组中的唯一值转换为字符串数组(例如),然后执行单次提取:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"myUnique in %@", uniqueIDArray]];

然后,您已在商店中拥有 ARE 的唯一数组。当你循环遍历你的对象时,你可以从那里检查那个数组,如果你跳过了那个唯一的,那你就插入了。这将为直接插入或跳过要求提供最佳性能。

答案 1 :(得分:0)

你需要从数据库获取并检查,你的代码将执行类似我在代码中经常使用的帮助方法,如果results.count是> 1,然后DUPLICATE发现:

- (NSManagedObject*) findOrCreateObjectByValue:(id)value
                              propertyName:(NSString*)propertyName
                                entityName:(NSString*)entityName
                            additionalInfo:(NSDictionary*)additionalInfo
                                   context:(NSManagedObjectContext*)context
                                     error:(NSError* __autoreleasing*)error
{

NSManagedObject* res = nil;

NSFetchRequest* r = [NSFetchRequest fetchRequestWithEntityName:entityName];
[r setPredicate:[NSPredicate predicateWithFormat:@"%K == %@",propertyName,value]];

NSArray* matched = [context executeFetchRequest:r
                                          error:error];

if (matched) {
    if ([matched count] < 2) {
        res = [matched lastObject];
        if (!res) { //No existing objects found, create one
            res = [NSEntityDescription insertNewObjectForEntityForName:entityName
                                                inManagedObjectContext:context];
            [res setValue:value
                   forKey:propertyName];
        }
    } else {
        if (error) {
            *error = [NSError errorWithDomain:@"some_domain"
                                         code:9999
                                     userInfo:@{@"description" : @"duplicates found"}];
        }
    }
}

return res;

}

相关问题