2012-03-05 158 views
1

リモートWebサービスからデータをダウンロードするとします。より正確に言えば、私はWebサービスからニュースのリストをダウンロードし、各ニュースにはNewsIDがあります。私たちはそのサービスの主キーと見なすことができるので、2つの等しいnewsIDは見つかりません。コアデータ属性の一意性

ニュースIDが既に存在しないデータのみを挿入するにはどうすればよいですか?

私はこの方法で私の解決策を立案しました:

- (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; 
} 

をしかし、私は私と同じオブジェクトが以前のコンテキストに挿入見つけるフェッチ要求を実行したとき、私は、仮定、ので、期待していない作品を行います。私が間違っている?

どうすれば修正できますか?

+0

なぜポインタへのポインタをnewsIDとして送信していますか? –

+0

パラメータが宣言されているため(NSNumber **)newsID –

答えて

0

あなたが検証しようとしているのと同じオブジェクトが見つかるようです。次のいずれかを試してください。

  1. フェッチ要求を実行し、他のエントリをチェックする前に結果配列から現​​在のオブジェクトを削除してください。
  2. 可能であれば、現在のオブジェクトを除外するように述語を調整します。
  3. resultCount > 0からresultCount > 1に変更してください。
関連する問題