核心数据属性唯一性

时间:2012-03-05 17:08:14

标签: objective-c ios core-data

我们假设我从远程Web服务下载数据。更准确地说,我从Web服务下载新闻列表,每个新闻都有一个newsID,我们可以将其视为服务的主键,因此我们找不到两个相同的newsID。

我怎样才能确定我只插入一个尚未存在的newsID的数据?

我用这种方法起草了我的解决方案:

- (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 :(得分:0)

好像你会找到你想要验证的同一个对象。尝试其中之一:

  1. 在检查其他条目之前,执行获取请求并从结果数组中删除当前对象。
  2. 调整谓词,以便在可能的情况下排除当前对象。
  3. resultCount > 0更改为resultCount > 1