Ниже мой найти или создать код:Правильного 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"
Спасибо!
Этот метод был бы невероятно медленным и растереть ваше приложение, если вы делаете насыпной обновление/создает –
ли вам есть лучшее предложение для реализации Find-Or-Create? – ArtSabintsev
Кроме того, это обычно выполняется в фоновом режиме в отдельном потоке. Опция также будет доступна для пользователя, чтобы сделать это прямо, но чтобы избежать столь большого количества простоя, я буду выполнять ее так часто в фоновом режиме. – ArtSabintsev