2012-05-25 2 views
0

Ниже мой найти или создать код:Правильного NSPredicate для Найти или-Создать шаблон в Core Data

+ (id)checkIfEntity:(NSString *)entityName 
     withIDValue:(NSString *)entityIDValue 
      forIDKey:(NSString *)entityIDKey 
    existsInContext:(NSManagedObjectContext *)context 
{ 

    // Create fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setReturnsObjectsAsFaults:NO]; 

    // Fetch messages data 
    NSEntityDescription *description = [NSEntityDescription entityForName:entityName inManagedObjectContext:context]; 
    [request setEntity:description]; 

    // Only include objects that exist (i.e. entityIDKey and entityIDValue's must exist) 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue]; 
    [request setPredicate:predicate];  

    // Execute request that returns array of dashboardEntrys 
    NSArray *array = [context executeFetchRequest:request error:nil]; 

    if ([array count]) { 

     NSLog(@"%@ = %@ DOES EXIST", entityIDKey, entityIDValue); 
     return [array objectAtIndex:0]; 
    } 

    NSLog(@"%@ = %@ DOES NOT EXIST", entityIDKey, entityIDValue); 
    return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context]; 
} 

Просьба игнорировать тот факт, что я не использующий передовые методы, имея два заявления о возврате - я сделаю это до того, как подтолкнуть мой код к выпуску.

Он работает, передавая объект NSManagedObject с entityName и имеет NSPredicate, который проверяет наличие entityIDKey со значением entityIDValue; entityIDKey = entityIDValue. Я также пробовал использовать ==.

Независимо от того, какой метод сравнения я использую, метод if ([array count]) никогда не попадает, поэтому второй оператор NSLog всегда получает вывод, определяя, что объект, который, как я знаю, существует в моем хранилище Core Data, фактически не существует. Поэтому в итоге я получаю много повторяющихся записей, когда я показываю содержимое своего магазина.

Правильно ли указано мое заявление NSPredicate?

`NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@=%@", entityIDKey, entityIDValue];` 

где entityIDKey = @"userID" и entityIDvalue = @"1234567890"

Спасибо!

+0

Этот метод был бы невероятно медленным и растереть ваше приложение, если вы делаете насыпной обновление/создает –

+0

ли вам есть лучшее предложение для реализации Find-Or-Create? – ArtSabintsev

+0

Кроме того, это обычно выполняется в фоновом режиме в отдельном потоке. Опция также будет доступна для пользователя, чтобы сделать это прямо, но чтобы избежать столь большого количества простоя, я буду выполнять ее так часто в фоновом режиме. – ArtSabintsev

ответ

0

Yup, проблема была определенно предикатом.

Аргумент предиката должен был:

%K == %@

не

%@ = %@

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