2012-07-30 9 views
6

説明が難しいですが、IDでカスタムNSManagedObjectの配列をフィルタリングするためにNSPredicateを使用しようとしています。更新、削除、新しいオブジェクトの追加が可能なサーバーがあります。JSONファイルのオブジェクトが存在する場合は、そのオブジェクトが存在するかどうかを制御する必要があります。存在しない場合はコアデータに挿入します。NSPredicateはオブジェクトに複数のIDが1つあればチェックします

私は今、この述語を使用しています:jsonFileは未解析のストアオブジェクトが含まれてい

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"storeId != %@", [jsonFile valueForKey:@"Id"]; 

。しかし、この述語を使うと、1つのidがいくつかのstoreIdと違うので、大きな配列が得られます。次のIDは一致します。

JSONファイルは、このいくつかの並べ替えです: - 他の誰かが修正を提案するかもしれない - おそらくオフになっている

 "Stores":[{ 
      "id":1, 
      "name":"Spar", 
      "city":"London" 
      } 
      { 
      "id":2, 
      "name":"WalMart", 
      "city":"Chicago" 
     }]; 

答えて

11

、しかし、おそらくあなたは、以下を使用することができます。

NSArray *jsonFile = /* your array of dictionaries */; 
NSArray *idList = [jsonFile valueForKey:@"id"]; // array of "id" numbers 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT(storeId IN %@)", idList]; 

これはjsonFile配列内のIDのいずれかと等しくないstoreIdを持っているすべての管理対象オブジェクトを提供します。

+0

これはまさに私が必要としていたものでした!ありがとうございました!それ以外の方法を調べる必要がある場合は、NSPredicate * predicate = [NSPredicate predicateWithFormat:@ "NOT(Id IN%@)"、fetchedArray]に変更するだけです; – lagos

+0

本当にエレガントなソリューションです。ありがとうございます! – Markus

0

述語の構文がありますが、配列を持っている場合、なぜ使用

- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate 

その方がはるかに簡単以来:私は私はあなたが達成しようとしているものを正しく理解すればわからない

NSInteger textID = ... // you set this 
NSInteger idx = [myArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop)) 
{ 
NSInteger objIdx = [obj objectForKey:@"id"] integerValue]; // integerValue works for both NSNUmbers and NSStrings 
if(objIdx == testID) { 
    return YES; 
    *stop = YES; 
} 
} 
関連する問題