2009-08-28 3 views
22

मेरे पास एक कोर डेटा मॉडल है जिसमें कार्य इकाई में वैकल्पिक से कई रिश्ते शामिल हैं जो बहिष्कृत डे इकाई को बहिष्कृत दिन हैं। बहिष्कृत दिन का गुण दिन है, जो एक एनएसडीएट वस्तु है। बहिष्कृत डे इकाई में कार्य इकाई के लिए एक संबंध अनिवार्य अनिवार्य है।कोर डेटा का उपयोग करते समय एक से अधिक रिश्ते के लिए एनएसपी्रेडिकेट को सही ढंग से कैसे सेट अप करें?

निर्दिष्ट दिन के लिए कार्यों को लाने के लिए, मुझे यह सुनिश्चित करने की आवश्यकता है कि निर्दिष्ट दिन किसी भी exludedDay इकाई की दिन संपत्ति के रूप में प्रकट नहीं होता है।

मैं के बावजूद क्या प्रलेखन कहते हैं, बिल्कुल काम नहीं करता

NSPredicate *dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"ALL excludedDays.day != %@", today]; 

की कोशिश कर रहा हालांकि शुरू किया, और आवेदन के लिए एक अपवाद फेंकता है: न आया हुआ अपवाद 'NSInvalidArgumentException', कारण की वजह से उनका समापन एप्लिकेशन: असमर्थित विधेय '।

इस मंच में एक ही प्रश्न पोस्ट करने के बाद, मैं विभिन्न लोगों की मदद से निम्नलिखित विधेय वसीयत करने में सक्षम था: यह पहली बार में काम किया

NSPredicate * dayIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"[email protected] == 0 || ([email protected] > 0 && NONE excludedDays.day == %@))", today]; 

, मैं सिर्फ पता चला है कि यह केवल काम करता है जब बहिष्कृत डे इकाई में केवल एक दिन होता है। जैसे ही बहिष्कृत डे इकाई में एक ही कार्य के लिए एक से अधिक दिन होते हैं, यह अनुमान काम करना बंद कर देता है। नतीजतन, एक दिन के लिए एक कार्य का चयन किया जाता है, भले ही दिन बहिष्कृत डे इकाई में दिन के रूप में दिखाई देता है, जो निश्चित रूप से गलत है। समस्या एनएसडीएटी ऑब्जेक्ट होने के बाद संपत्ति दिन से जुड़ी नहीं है: संबंधित एनएसएसटींग के साथ दिन को प्रतिस्थापित करना या एक पूर्णांक के साथ समकक्ष रूप से, मुझे अभी भी एक ही समस्या और गलत व्यवहार का सामना करना पड़ता है।

इस मामले में भविष्यवाणी को लागू करने का सही तरीका क्या है? कोर डेटा का उपयोग करते समय यह किसी भी समग्र ऑपरेटर से संबंधित बग हो सकता है? अग्रिम धन्यवाद, यह अब मुझे पागल कर रहा है।

उत्तर

42

यह पता चला कि यह अभी तक और/या असंगत प्रलेखन लापता के साथ एक और समस्या है।

इस मामले में सही विधेय निम्नलिखित में से एक है:

[NSPredicate predicateWithFormat:@"([email protected] == 0) OR (0 == SUBQUERY(excludedOccurrences, $sub, $sub.day == %@)[email protected])", today] 

विधेय में, एक सबक्वेरी अगर अपने परीक्षण की तारीख से मेल खाते एक तारीख के साथ संबंधित excludedOccurrences की संख्या शून्य के बराबर है परीक्षण करने के लिए प्रयोग किया जाता है।हालांकि, दस्तावेज भ्रामक है। भविष्य में प्रोग्रामिंग गाइड का कहना है कि कई रिश्तों के साथ-साथ भविष्यवाणियों के उपयोग के बारे में भी कहा गया है। रिश्ते

साथ

का उपयोग विधेय आप एक से-अनेक संबंध का उपयोग करते हैं, एक विधेय के निर्माण थोड़ी अलग है।

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
    @"ANY employees.firstName like 'Matthew'"]; 

आप विभागों को खोजने के लिए करना चाहते हैं: आप विभागों, जिसमें कर्मचारियों की कम से कम एक पहला नाम है लाने के लिए चाहते हैं "मैथ्यू," उदाहरण के लिए, आप एक किसी भी ऑपरेटर के रूप में निम्नलिखित उदाहरण में दिखाया गया का उपयोग जिसमें सभी कर्मचारियों को एक निश्चित राशि से अधिक का भुगतान कर रहे हैं तो आपको ये उदाहरण में दिखाया गया एक सभी ऑपरेटर का उपयोग करें:

float salary = ... ; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: 
    @"ALL employees.salary > %f", salary]; 
+0

शायद आप जानते हैं कि SSEQUERY के साथ अभिव्यक्ति को NSExpresion और NSComparisonPredicate कक्षाओं के साथ कैसे लिखना है? http://stackoverflow.com/questions/2006927/whats-better-way-to-build-nspredicate-with-to-many-deep-relationships धन्यवाद – Victor

+1

: अपने जवाब के साथ, मैं मेरे सवाल का फैसला किया वास्तव में उपयोगी, इस उत्तर के लिए बहुत बहुत धन्यवाद। – Maria

1

इस उत्सव को हल करने के लिए उत्सुक उत्सुकता से मैंने एक छोटी परियोजना स्थापित की और उस संदर्भ को बनाया जिसे आप उपयोग कर रहे हैं।

NSDate *today = [NSDate date]; 
NSMutableArray *objects = [NSMutableArray array]; 

{ 
    NSArray *day = [NSArray arrayWithObjects:today, [today dateByAddingTimeInterval:20.0f], nil]; 
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; 
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; 

    [objects addObject:object]; 
} 

{ 
    NSArray *day = [NSArray arrayWithObjects:[today dateByAddingTimeInterval:20.0f], nil]; 
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"]; 
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"]; 

    [objects addObject:object]; 
} 


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE excludedDay.day == %@", today]; 
NSArray *filtered = [objects filteredArrayUsingPredicate:predicate]; 

NSLog(@"%@", filtered); 

इस वस्तु देता है जब:

  1. दिन सरणी खाली
  2. दिन सरणी 'आज की तारीख में नहीं है

इस वस्तु नहीं देता है जब:

  1. दिन सरणी में शामिल है 'आज'
    • यह कोई फर्क नहीं पड़ता कैसे दिन सरणी में कई वस्तुओं रहे हैं
+1

दुर्भाग्य से, यह एक पूरी तरह से अलग सेटिंग है: मेरी संदर्भ कोर डाटा और iPhone SDK पर आधारित है 3.0 या 3.1। ऐसा लगता है कि कई डेटा रिश्तों का पालन करते समय कोर डेटा ढांचा सही ढंग से भविष्यवाणी नहीं कर रहा है। मैंने पहले से ही एक बग दायर किया है और ऐप्पल इंजीनियर इस पर काम कर रहे हैं, लेकिन अभी भी उनसे कोई जवाब नहीं है। –

+1

फिर यह वास्तव में एक कोर डेटा रिलेड मुद्दा है, क्योंकि एक ही अनुमान का उपयोग करते हुए, लेकिन कोर डेटा के बिना यह ठीक से काम कर रहा है (जैसा कि उसी (Foumdation- related) संदर्भ की नकल करने के मेरे प्रयास में देखा गया है) – Joost

+1

ने मुझे 2011 में मदद की :) +1 –