2014-02-05 3 views
3

Я вставляю новые объекты в базу данных по данным ядра. Есть ли способ проверить, есть ли дубликат в базе данных, прежде чем вставлять значения?Поиск повторяющихся значений в данных ядра

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

каждый раз, когда я запускаю приложение, он снова вводит значения. Я хочу проверить, есть ли в нем какая-либо новая категория, если нет, тогда я добавлю только новую.

заранее спасибо ..

+1

Сделайте выбор, прежде чем вставлять. Вставьте только в том случае, если счетчик выборки равен 0. – user2734323

ответ

6

вы можете получить или вы можете рассчитывать. Подсчет выполняется намного быстрее, чем выборка. Зависит от того, что вы пытаетесь сделать.

Если вы просто хотите вставить новые и пропустить дубликаты, используйте -[NSManagedObjectContext countForFetchRequest: error:], чтобы определить, существует ли объект.

Вы можете предварительно построить предикат и просто заменить уникальное значение для каждого цикла, чтобы даже стоимость предиката была низкой. Это довольно реалистичное, но не лучшее решение, потому что оно попадает на диск в каждом цикле.

Другим вариантом было бы изменить выборку иметь:

  • Просто уникальное значение
  • NSDictionary результат

Затем возьмите все уникальных значений из вашего вставным массива в массив строк (например), затем выполните одну выборку с помощью:

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

Тогда у вас есть массив уникальных вещей, который ARE уже в магазине. Оттуда, когда вы зацикливаете свои объекты, вы проверяете этот массив, если в нем есть уникальная возможность пропустить, иначе вы вставляете. Это даст наилучшую производительность для прямой вставки или пропуска.

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; 

}

Смежные вопросы