2009-09-16 17 views
5

मैं एक खास प्रकार के अभिलेखों का एक समूह, उपयोगकर्ता द्वारा परिभाषित प्रकार की एक सूची के आधार पर लाने के लिए कोशिश कर रहा हूँ ...क्या आईफोन पर कोरडाटा भविष्यवाणी करता है?

[fetchRequest setEntity:[NSEntityDescription entityForName:@"myRecord" inManagedObjectContext:self.managedObjectContext]]; 
NSSet *shipTypes = [NSSet setWithObjects:[NSNumber numberWithInt:70], 
        [NSNumber numberWithInt:71], 
        [NSNumber numberWithInt:72], 
        [NSNumber numberWithInt:73], 
        [NSNumber numberWithInt:74], 
        nil]; 
NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"type in %@", shipTypes]; 
[fetchRequest setPredicate:aPredicate]; 
theRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

... जब रन executeFetchRequest संदेश एक अपवाद फेंकता है ...

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (type IN {71, 73, 70, 72, 74})' 

क्या मैंने कुछ गलत किया है, या यह वास्तव में समर्थित नहीं है?

+1

यह काम करना चाहिए, लेकिन मैं अपने जीवन के लिए यह नहीं समझ सकता कि यह क्यों नहीं है। पूर्वानुमान प्रारूप स्ट्रिंग सिंटेक्स दस्तावेज़ पर पढ़ें और देखें कि क्या आप कुछ भी पा सकते हैं: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html – Tim

+0

सहमत हैं। आप एनएसएसएटी के बजाय एनएसएआरएआरई का प्रयास कर सकते हैं, लेकिन इसे लिखित के रूप में काम करना चाहिए। –

+2

यदि आपको यह काम मिल गया है तो आपको जवाबों में से एक को सही के रूप में चिह्नित करना चाहिए। –

उत्तर

15

मेरा मानना ​​है कि एलेक्स सही है कि आपको एनएसएआरएआरई का उपयोग करना होगा, हालांकि स्पष्ट रूप से यह अच्छा होगा अगर एनएसएसएटी को यहां स्वीकार किया गया हो, क्योंकि ऑर्डर इतना महत्वपूर्ण नहीं है (हालांकि यह अनुमान लगा सकता है कि एसक्यूएल कितनी जल्दी चल सकता है) ।

एक साइड नोट के रूप में, मैं कभी भी + predicateWithFormat का उपयोग नहीं करता हूं: किसी भी कोड में कॉल करें, क्योंकि यह संकलन-समय संवेदना या टाइप-चेकिंग नहीं कर सकता है। मैं व्यक्तिगत कक्षाओं का उपयोग करने की अत्यधिक सलाह देता हूं।

इस मामले में, मुझे क्या करना चाहते हैं:

fetchRequest.entity = [NSEntityDescription entityForName:@"myRecord" inManagedObjectContext:self.managedObjectContext]]; 

NSArray *shipTypes = [NSArray arrayWithObjects:[NSNumber numberWithInt:70], 
             [NSNumber numberWithInt:71], 
             [NSNumber numberWithInt:72], 
             [NSNumber numberWithInt:73], 
             [NSNumber numberWithInt:74], 
             nil]; 
fetchRequest.predicate = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"type"] rightExpression:[NSExpression expressionForConstantValue:shipTypes] modifier:NSDirectPredicateModifier type:NSInPredicateOperatorType options:0]; 

theRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
नहीं

है कि इस संकलन समय पर इस विशेष त्रुटि पकड़ा होता, लेकिन यह संभावित NSExpression स्तर पर इसे पकड़ा है, इस प्रकार यह बहुत स्पष्ट कर रही है क्या गलत हुआ।

+0

यह एनएसएसएआर की बजाय एनएसएआरएआरई का उपयोग करके काम करता है। इसे पकड़ने के लिए सभी को धन्यवाद। –

0

हम्म अपने विधेय बदलने का प्रयास करें। मैंने किसी भी कीवर्ड को जोड़ने और एनएसएआरएआरई का उपयोग करने की कोशिश की। असल में मैं कोर डेटा से यह अपवाद प्राप्त करने के साथ शुरू करने के लिए एनएसएएरे का उपयोग कर रहा था। पूर्वदर्शी में लगता है कि क्योंकि मैं दो अभिव्यक्तियों को जोड़ रहा था और यह कोर डेटा के लिए एक समस्या थी। (मैं जानता हूँ कि मैं वापस जाने के लिए और इस की पुष्टि करनी चाहिए लेकिन इस विचार सिर्फ इस पोस्ट को पढ़ने के दौरान, घटित हुआ।) यहाँ अपने मूल अभिव्यक्ति है:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"BPM BETWEEN { %d, %d } AND GENRE IN %@", lower, upper, genres]; 

मेरे समाधान यह को तोड़ने के लिए दो भागों में किया गया था। अब, मैं भविष्यवाणी का उपयोग कर बीपीएम के लिए क्वेरी जारी करता हूं लेकिन मैं परिणामस्वरूप सरणी लेता हूं और उपयोग करता हूं -फिल्टरअरेयूयूइंग @ "शैली IN% @" के साथ मुद्रित करें। इस प्रकार:

array = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"genre IN %@", genres]]; 

यह मेरे लिए काम करता है।

0

मैं इसके साथ संघर्ष कर रहा था। अंततः मैं प्रत्येक सेट के लिए एक उप predicate कर समाप्त हो गया।

उदाहरण के लिए

तो:

NSMutableArray *subpredicates = [NSMutableArray array]; 

NSArray *shipTypes = [NSArray arrayWithObjects:[NSNumber numberWithInt:70], 
            [NSNumber numberWithInt:71], 
            [NSNumber numberWithInt:72], 
            [NSNumber numberWithInt:73], 
            [NSNumber numberWithInt:74], 
            nil]; 

for (NSNumber *num in shipTypes) { 
    [subpredicates addObject:[NSPredicate predicateWithFormat:@"ANY type == %@", num]];   
} 

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 

कि उस प्रकार यह सोचते है एक NSSet है। यदि ऐसा नहीं है तो आप बस:

for (NSNumber *num in shipTypes) { 
    [subpredicates addObject:[NSPredicate predicateWithFormat:@"type == %@", num]];   
} 
संबंधित मुद्दे