2015-12-10 1 views
6

私が指定した基準を満たす特定のエンティティから、それらのオブジェクトをフェッチする機能があります:私は、複数のagumentsの配列を渡すと(複数の引数と「AND行動」とNSPredicate

func fetchWithPredicate(entityName: String, argumentArray: [AnyObject]) -> [NSManagedObject] { 

    let fetchRequest = NSFetchRequest(entityName: entityName) 
    fetchRequest.predicate = NSPredicate(format: "%K == %@", argumentArray: argumentArray) 

    do { 
     return try self.managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject] 
    } catch { 
     let fetchError = error as NSError 
     print(fetchError) 
     return [NSManagedObject]() 
    } 

} 

を複数の属性名と値)は、このようなクエリを作成するようです:

attributeName1 = value1 OR attributeName2 = value2 OR attributeName3 = value3 OR... 

私はこれらのANDsのORを変更したいと思います。

EDIT:

問題はそれだけでreplacing the first two itemsの "%K ==%の@" とあったということでした。

だから、私はNSCompoundPredicate to create a predicate dynamicallyを作成する必要があります。あなたの例では

答えて

4

をすべての書式トークンを提供する必要があります

subPredicates[NSPredicate]配列であり、各subpredicate が(未テスト)このような

NSPredicate(format: "%K == %@", key, value) 

何かをループで渡された引数から作成された

let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates) 

:あなたは

func fetchWithPredicate(entityName: String, argumentArray: [NSObject]) -> [NSManagedObject] { 

    var subPredicates : [NSPredicate] = [] 
    for i in 0.stride(to: argumentArray.count, by: 2) { 
     let key = argumentArray[i] 
     let value = argumentArray[i+1] 
     let subPredicate = NSPredicate(format: "%K == %@", key, value) 
     subPredicates.append(subPredicate) 
    } 

    let fetchRequest = NSFetchRequest(entityName: entityName) 
    fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates) 

    // ... 
} 
9

%K%@形式のトークンが置き換えられのみ引数配列の最初の2つの項目によって、他の項目は無視されます。

あなたは、例えば、NSCompoundPredicateを使用して、動的に(式の可変数を持つ)述語を作成するには、たとえば、文字列に置き換えられるために

NSPredicate(format: "%K == %@ AND %K == %@", argumentArray:["key1", "value1", "key2", "value2"]) 
+0

これは、最初の2つのアイテムだけを置き換えたものです。ありがとう! – angeldev

3

複合述語を使用できます。

NSDictionary *conds = @{ @"key1": @"value1", @"key2", @"value2" }; 

NSMutableArray *predicates = [NSMutableArray arrayWithCapacity:conds.allKeys.length]; 

for (NSString *key in conds.allKeys) 
{ 
    [predicates addObject:[NSPredicate predicateWithFormat:@"%K == %@", key, conds[key]]]; 
} 
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates]; 
0

スウィフト3:私は

もしあなたのキーと値が辞書にある...私は運動としてスウィフトへの翻訳を残しておきます、あなたのObjective-Cの構文をあげます

私は最も簡単な方法を発見しました。

var predicate = NSPredicate(format: "key1 = %@ AND key2 = %@", value1, value2) 
関連する問題