Уникальность атрибута Core Data - PullRequest
1 голос
/ 05 марта 2012

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

Как я могубыть уверенным, что я вставляю только те данные с новостным идентификатором, который еще не существует?

Я набросал свое решение с помощью этого метода:

- (BOOL)validateNewsID:(NSNumber **)newsID error:(NSError **)error
{
    NSError *countError = nil;
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    [fetchRequest setEntity:[self entity]];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"newsID == %@", *newsID];
    [fetchRequest setPredicate:predicate];


    NSUInteger resultCount = [SharedManagedObjectContext countForFetchRequest:fetchRequest error:&countError];
    if (countError) {
        OLog(countError);
        *error = countError;
        return NO;
    }

    if (resultCount > 0) {
        NSString *errorString       = @"NewsID should be unique";
        NSDictionary *userInfoDict  = [NSDictionary dictionaryWithObject:errorString 
                                                                  forKey:NSLocalizedDescriptionKey];
        NSError *uniquenessError    = [[[NSError alloc] initWithDomain:kNewsValidationDomain 
                                                                  code:kNewsValidationUniquenessCode 
                                                              userInfo:userInfoDict] autorelease];
        *error = uniquenessError;
        return NO;
    }

    return YES; 
}

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

Как мне это исправить?

1 Ответ

0 голосов
/ 10 марта 2012

Похоже, вы нашли бы тот же объект, который пытаетесь проверить. Попробуйте один из них:

  1. Выполнить запрос на выборку и удалить текущий объект из массива результатов перед проверкой других записей.
  2. Настройте предикат, чтобы исключить текущий объект, если это возможно.
  3. Изменить resultCount > 0 на resultCount > 1.
...