2010-09-28 5 views
24

ऐप्पल से सबक्वायरी कीवर्ड के बारे में शून्य दस्तावेज प्रतीत होता है और मुझे एसओ या Google पर इसके बारे में एक सरल स्पष्टीकरण नहीं मिल रहा है। यह साजिश है! ;)एनएसपीडिकेट अभिव्यक्ति में सबक्विरी का त्वरित स्पष्टीकरण

कृपया, आंतरिक सर्कल से कोई भी कृपया अपने सिंटैक्स का त्वरित विवरण प्रदान कर सकता है ताकि मैं इसका उपयोग कर सकूं?

SUBQUERY(Bs, $x, $x IN %@) 

धन्यवाद

उत्तर

18

This is what a subquery evaluates to. (this mailing list thread से मिला, "NSPredicate सबक्वेरी" गूगल में के लिए # 1 हिट।) दस्तावेज की कि बिट को भी बताते हैं कि कैसे विधेय प्रारूप स्ट्रिंग वाक्यविन्यास यह से संबंधित है।

+0

अरे! मुझे विश्वास नहीं है कि मुझे याद आया। बहुत बहुत धन्यवाद। – pieSquared

+0

आप कैसे जानते हैं कि किस पत्र का उपयोग करना है? कुछ स्थानों पर मैं $ x कुछ स्थानों को देखता हूं, मुझे $ s दिखाई देता है, कुछ मुझे $ ए देखते हैं, और मैं संदर्भ से $ x और $ s के बीच किसी भी अंतर को नहीं देख सकता। – jpswain

+0

@ नारंगी80: परिवर्तनीय नाम आपकी पसंद है। मेरे उत्तर में लिंक किए गए दस्तावेज़ देखें। यदि आप पाइथन जानते हैं, तो यह कहने की तरह है '[एक्स एक्स संग्रह में एक्स (अगर x शामिल कुछ शर्त)] '। जहां तक ​​मुझे पता है, वैरिएबल नाम को एक भी अक्षर नहीं होना चाहिए। –

41

और लोग हैं, जो काफी नहीं मिलता है के लिए क्या प्रलेखन कह रहा है, एक SUBQUERY अनिवार्य रूप से यह है:

SUBQUERY(collection, variableName, predicateFormat) 

और (simplistically) इस तरह लागू किया जा सकता:

id resultingCollection = ...; //a new collection, either a mutable set or array 
NSMutableDictionary * substitutions = [NSMutableDictionary dictionary]; 
NSPredicate * p = [NSPredicate predicateWithFormat:predicateFormat]; 
for (id variable in collection) { 
    [substitutions setObject:variable forKey:variableName]; 
    NSPredicate * filter = [p predicateWithSubstitutionVariables:substitutions]; 
    if ([filter evaluateWithObject:collection] == YES) { 
    [resultingCollection addObject:variable]; 
    } 
} 
return resultingCollection; 

तो संक्षेप में, SUBQUERY मूल रूप से SUBQUERY की पूर्व अभिव्यक्ति के आधार पर वस्तुओं का संग्रह ले रहा है और विभिन्न वस्तुओं को फ़िल्टर कर रहा है, और परिणामी संग्रह को वापस कर रहा है। (और विधेय ही अन्य SUBQUERY रों शामिल कर सकते हैं)

उदाहरण:

NSArray * arrayOfArrays = [NSArray arrayWithObjects: 
          [NSArray arrayWithObjects:....], 
          [NSArray arrayWithObjects:....], 
          [NSArray arrayWithObjects:....], 
          [NSArray arrayWithObjects:....], 
          [NSArray arrayWithObjects:....], 
          [NSArray arrayWithObjects:....], 
          nil]; 
NSPredicate * filter = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, [email protected] > 42)"]; 
NSArray * filtered = [arrayOfArrays filteredArrayUsingPredicate:filter]; 
//"filtered" is an array of arrays 
//the only arrays in "filtered" will have at least 42 elements each 
+1

लिंक के लिए +1 आपका एनएसपीडिकेट संकलित नहीं होगा: पकड़ा गया " NSInvalidArgumentException "," प्रारूप स्ट्रिंग को पार्स करने में असमर्थ "SUBQUERY (SELF, $ a, $ a। @ Count> 2)" – cfischer

+0

@cfisher माइनर सुधार: यह एक रनटाइम त्रुटि है, संकलन त्रुटि नहीं है। (एक झटका होने की कोशिश नहीं कर रहा है।) – sudo

11

Here महान स्पष्टीकरण और उदाहरण के साथ इस पर एक लेख है। कि सभी वस्तुओं पर मूल्यांकन किया जाता है -

0

Subquery एक विधेय ($x IN %@ तीसरा तर्क) का प्रतिनिधित्व करता है (दूसरा तर्क - $x - यह foreach में एक चर नाम की तरह है) एक रिश्ते की (- Bs पहला तर्क)। इसी प्रकार नियमित क्वेरी के लिए वस्तुओं की एक सूची लौटाती है।

मैं कई स्थानों है कि लोगों को $x लगभग हठधर्मिता से उपयोग करने में देखते हैं, लेकिन $objectobjects में संबंध के साथ-साथ सही समझ में आता है (या $citycities में ...) :)

संबंधित मुद्दे