2011-10-27 3 views
5

मैं उद्देश्य सी में कोर डेटा NSFetchRequest का निर्माण कर रहा हूं। डेटा मॉडल में एक अमूर्त मूल इकाई होती है (जिसमें 4 मूलभूत विशेषताएं होती हैं), और कई अलग-अलग बाल संस्थाएं जिनमें गुण शामिल हैं जो माता-पिता में नहीं हैं। कुछ बच्चों में ऐसे गुण होते हैं जो समान नाम और डेटा प्रकार साझा करते हैं।एक कोर डेटा यह जांचने के लिए प्रमाणित करता है कि क्या बच्चे इकाइयों में कोई विशेषता या "कीपैथ" है?

मैं मूल इकाई को fetchRequest लागू कर रहा हूं, ताकि यह बच्चे की इकाइयों के सभी उदाहरणों को यह देखने के लिए खोज सके कि "कीपैथ" मौजूद है या नहीं।

क्या मैं एक भविष्यवाणी कर सकता हूं जो केवल उन विशेषताओं को वापस लाएगा जिनमें एक विशेष विशेषता है?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name]; 

यहाँ, विशेषता NSAttributeDescription का एक उदाहरण है, और लक्ष्य अन्य संस्थाओं विशेषताओं की अपनी सूची के भीतर एक मेल खाने वाले नाम की एक विशेषता है कि के लिए खोज करने के लिए है, लेकिन मुझे यकीन है कि कैसे फ़ॉर्मेट करने के लिए नहीं कर रहा हूँ भविष्यवाणी

यदि आवश्यक हो तो मैं आगे स्पष्टीकरण दे सकता हूं। धन्यवाद!

उत्तर

5

वहाँ एक कारण है कि आप के बजाय के उदाहरण मॉडल का निरीक्षण कर रहे हैं: तो फिर तुम लाए जाने इस तरह विधेय बना सकता है? आप आसानी से पता लगा सकते हैं कि किस इकाई प्रकार के पास दी गई संपत्ति

for (NSEntityDescription* entityDescription in [self managedObjectModel]) { 
    if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) { 
    // objects of this entity support the property you're looking for 
    } 
} 
+0

मुझे उदाहरणों से पूछताछ की आवश्यकता है क्योंकि अंतिम लक्ष्य उन सभी उदाहरणों से विशेषता के विशिष्ट मान प्राप्त करना है जो इसे परिभाषित करते हैं। मैं वियनके ने सुझाव दिया कि वर्कअराउंड के लिए इंडेक्स टेबल को प्रक्रियात्मक रूप से जेनरेट करने के लिए यहां सूचीबद्ध एक जैसा लूप का उपयोग कर रहा हूं। –

+0

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

+0

यदि यह प्रदर्शन आपके बाद है, तो शायद आपको अपने डेटाबेस मॉडल को थोड़ा सा पुनर्विचार करना चाहिए। कोर डेटा विभिन्न डेटाबेस तालिकाओं में विभिन्न इकाइयों को स्टोर करेगा, इसलिए यदि आप एक जटिल क्वेरी के साथ आते हैं जो पूरे इकाइयों में काम करता है तो शायद यह बहुत अच्छा प्रदर्शन नहीं करेगा। हो सकता है कि आप संपत्ति को मूल इकाई में जोड़ने से बेहतर हो और बस इसे उन उपक्रमों में अप्रयुक्त छोड़ दें जिन्हें इसकी आवश्यकता नहीं है। – edsko

1

दिलचस्प प्रश्न, कुछ प्रयोग के योग्य (बेहतर सहायता की अनुपस्थिति में)।

मैं एक प्रबंधित वस्तु पर इस विधेय की कोशिश की:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”]; 

लेकिन मैं यह त्रुटि आई: "। विधेय के लिए लागू नहीं किया गया एसक्यूएल पीढ़ी"

कौन सा मेरे लिए पता चलता है कि SQL में खुदाई करने के लिए तैयार नहीं है NSArrays, जो आप अपने गुण नामों के लिए एनएसईएनटीटी डिस्क्रिप्शन से पूछताछ करते हैं।

और कोई नहीं एक सीधा लाने का अनुरोध के माध्यम से एक विधेय के साथ आ सकते हैं कि तुम क्या चाहते हो जाएगा, मैं इस समाधान का सुझाव है:

एक इकाई Namernamed और एक हैं- attr एक एकल स्ट्रिंग है कि परिभाषित करें कई रिश्ते members। इनमें से प्रत्येक संभावित एटर्स के लिए इनमें से एक बनाएं जो आपके लक्षित बच्चे की संस्थाएं हो सकती हैं। फिर बच्चे को Namer पर namers (members रिश्तों के विपरीत) से कई रिश्तों को शामिल किया गया है। सम्मिलन पर, इस संबंध में उचित "नाम" जोड़ें।

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought]; 
// ("namerSought" is an instance of Namer.) 
+0

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

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

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