【问题标题】: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 时才插入。

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


【解决方案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;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多