我正在通过核心数据将新对象插入数据库。有什么方法可以在我插入值之前检查数据库中是否有任何重复?
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 :(得分:7)
你可以取,或者你可以数。计数比获取快得多。取决于你想要做什么。
如果您只想插入新副本并跳过重复项,请使用-[NSManagedObjectContext countForFetchRequest: error:]
确定对象是否存在。
您可以预先构建谓词,只需替换每个循环上的唯一值,这样即使谓词的成本也很低。这是相当高效的,但不是最好的解决方案,因为它会在每个循环中击中磁盘。
另一种选择是将获取更改为:
然后将所有的可插入数组中的唯一值转换为字符串数组(例如),然后执行单次提取:
[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;
}