在核心数据中查找重复值
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;
【讨论】:
以上是关于在核心数据中查找重复值的主要内容,如果未能解决你的问题,请参考以下文章