2015-12-10 14 views
6

साथ 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]() 
    } 

} 

जब मैं कई aguments (कई विशेषता नामों और साथ एक सरणी पारित

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

मैं ands के लिए इन अन्य रैंकों को बदलना चाहते हैं: मान) यह है कि इस तरह एक प्रश्न पैदा करता है लगता है।

संपादित करें:

समस्या यह है कि यह केवल replacing the first two items साथ "% कश्मीर ==% @" था।

तो, मुझे NSCompoundPredicate to create a predicate dynamically बनाना है।

उत्तर

4

एक विधेय (भाव के परिवर्तनशील) के साथ बनाने के लिए गतिशील, NSCompoundPredicate का उपयोग करता है, उदा के लिए स्ट्रिंग में बदला जाएगा

let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: subPredicates) 

जहां subPredicates एक [NSPredicate] सरणी है, और प्रत्येक subpredicate साथ

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

कुछ इस तरह (untested) एक पाश में प्रदान किए गए तर्कों से बनाई गई है:

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 और %@ प्रारूप टोकन बदल दिया जाता है केवल तर्क सरणी के पहले दो आइटम द्वारा, अन्य मदों अनदेखी कर रहे हैं।

आप सभी प्रारूप टोकन प्रदान करने के लिए उदाहरण

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

यह सच है, यह केवल पहले दो आइटम की जगह किया गया था। धन्यवाद! – angeldev

3

आप एक यौगिक predicate का उपयोग कर सकते हैं। मैं तुम्हें ऑब्जेक्टिव-सी वाक्य रचना दे देंगे, मैं एक व्यायाम के रूप स्विफ्ट के लिए अनुवाद छोड़ देंगे ...

यदि आपका कुंजी और मूल्यों एक शब्दकोश में हैं:

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

मुझे सबसे आसान तरीका मिला।

var predicate = NSPredicate(format: "key1 = %@ AND key2 = %@", value1, value2) 
संबंधित मुद्दे