在核心数据中查找重复值

Posted

技术标签:

【中文标题】在核心数据中查找重复值【英文标题】:Finding duplicate values in core data 【发布时间】:2014-02-05 03:48:56 【问题描述】:

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

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

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

提前谢谢..

【问题讨论】:

在插入之前进行提取。仅当获取计数为 0 时才插入。 【参考方案1】:

你可以取也可以数。计数比获取快得多。取决于你想做什么。

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

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

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

只有独特的价值 NSDictionary 结果

然后将 所有 的唯一值从可插入数组中抓取到字符串数组中(例如),然后使用以下命令进行一次提取:

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

那么您已经在商店中ARE 拥有一系列独特的产品。从那里循环遍历对象时,您检查该数组,如果您跳过那里的唯一,否则您插入。这将为直线插入或跳过要求产生最佳性能。

【讨论】:

【参考方案2】:

您需要从数据库中获取并检查,您的代码将执行类似于我在代码中经常使用的这种辅助方法的操作,如果 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;

【讨论】:

以上是关于在核心数据中查找重复值的主要内容,如果未能解决你的问题,请参考以下文章

手机wps如何查找相同内容?

wps怎么找相同的数据

如何在 Oracle 的表中查找重复值?

根据特定条件查找重复值

选择数据并在所选记录中查找重复值的 sql 查询

IOS核心数据:计算重复值