2012-06-26 19 views
8

यह काफी मजाकिया है। मेरे आवेदन में मैं डेटाबेस में हजारों प्रविष्टि बनाता हूं (दूसरे धागे में, मैं जादुई रिकार्ड का उपयोग कर रहा हूं)। सबकुछ ठीक काम करता है (पृष्ठभूमि/अग्रभूमि/संदर्भ बिंदु से)।NSPredicate निष्पादित नहीं

- (NSArray *) familiesInCompany:(Company *) company { 
    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"company == %@", company]; 
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"company.name == %@", company.name]; 

    NSArray *first = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate1]; 
    NSArray *second = [Family MR_findAllSortedBy:@"name" ascending:YES withPredicate:predicate2]; 
    NSArray *third = [Family MR_findByAttribute:@"company" withValue:company andOrderBy:@"name" ascending:YES]; 

    return second; 
} 

अब मैं क्या मिलता है:

  • पहले:

    मुख्य थ्रेड में, मैं "बस डाला" डेटा प्राप्त करने का प्रयास करते हैं,, मैं निम्नलिखित व्यवहार की खोज की है एक खाली सरणी

  • सेकंड: सभी Family ऑब्जेक्ट्स शामिल हैं, अपेक्षित
  • तीसरा: एक खाली सरणी है।

SQL विवरण मैं निम्नलिखित मिल डिबगिंग द्वारा:

"पहली" बयान:

CoreData: एनोटेशन: कुल लाने निष्पादन समय: 0.0000s 0 पंक्तियों के लिए।

"दूसरी" बयान ":

CoreData: एसक्यूएल: 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZCOMPANY ZFAMILY t0 से ZCOMPANY t1 शामिल हों t0 चालू करें चुनें। ZCOMPANY = t1.Z_PK कहां t1.ZNAME = t0.ZNAME

CoreData द्वारा आदेश: एनोटेशन: एसक्यूएल कनेक्शन लाने का समय: 0.0005s

CoreData: एनोटेशन: कुल लाने निष्पादन समय: 0.0007s 2 के लिए पंक्तियों।

"तीसरा" बयान:

CoreData: एनोटेशन: कुल निष्पादन समय लाने: 0.0000s 0 के लिए पंक्तियों।

उल्लसित बात यह है कि मैं एप्लिकेशन को बंद करता हूं (मेरा मतलब है कि वास्तव में इसे मैन्युअल रूप से समाप्त कर दिया जाता है) और मैं इसे वापस खोलता हूं, सभी तीन "fetching" कथन काम करते हैं।

क्यों पहला और तीसरा fetch स्टेटमेंट कभी निष्पादित नहीं किया जा रहा है? समस्या में कैसे खोदना है?

+0

अनिवार्य रूप से एक ही समस्या होने के कारण, मुझे एक NSFetchedResultsController कार्यान्वयन के साथ लगता है। हाल ही में बनाए गए रिकॉर्ड fetch परिणाम में दिखाई नहीं देते हैं, लेकिन जब मैं सीधे जांचता हूं तो लगातार स्टोर में लिखा गया है - सही गिनती रिश्ते में भी दिखाई देती है NSSet, लेकिन NSPredicate उन्हें नहीं देखता है। अजीब। MagicalRecord 2 का उपयोग करना - पिछले प्रोजेक्ट के लिए 1.x संस्करण का उपयोग किया गया था और इसमें कोई परेशानी नहीं थी, इसलिए मैं केवल पाठ्यक्रम बदल सकता हूं और पुराने संस्करण का उपयोग कर सकता हूं। –

+0

बेवकूफ (और ऑफ-विषय का प्रकार) प्रश्न: आप एसक्यूएल स्टेटमेंट कैसे लॉगिंग कर रहे हैं? मैं वास्तव में उत्सुक हूं कि बेहतर तरीके से समझने के लिए मेरे ऐप में यह कैसे करना है –

+1

@FelipeSabino जांचें http://stackoverflow.com/questions/6428630/xcode4-and-core-data-how-to-enable-sql-debugging और http://d.pr/i/Lszs –

उत्तर

8

मेरे पास यह वही मुद्दा था, यही वह है जो मैंने पाया, और मैंने इसे कैसे हल किया।

जादुई रिकॉर्ड में NSManagedObjectContext डिफ़ॉल्ट NSManagedObjectContext के मूल के रूप में रूट रूट है। जब मैं डिफ़ॉल्ट संदर्भ में NSFetchedResultsController बनाता हूं, तो बस आपके जैसा ही ठीक काम करता है।

समस्या यह है कि सभी नईNSManagedObject रों की उनकी अभी भी अस्थायी ObjectID के साथ वापस आ 'है। तो, मेरे मामले में, मैं एक संबंधित तालिका पर एक प्रश्न का दायरा देने के लिए NSPredicate का उपयोग कर रहा था।मैंने सिर्फ एसोसिएशन विधि को नहीं बुलाया क्योंकि मैं सब कुछ को स्मृति में लोड नहीं करना चाहता था और मेरे लिए परिवर्तनों को संभालने के लिए NSFetchedResultsController चाहता था।

अस्थायी ObjectID के साथ क्वेरी शून्य परिणाम पाती है और यह वही है जो यह प्रदर्शित करता है।

स्पष्ट रूप से बच्चे के संदर्भ (डिफ़ॉल्ट) को गैर-अस्थायी आईडी में परिवर्तन का लाभ नहीं मिलता है, भले ही इसे बैकिंग स्टोर पर रखा गया हो।

जब भी मैंने obtainPermanentIDsForObjects:error: के साथ इस मुद्दे को मजबूर करने का प्रयास किया तो भी बदतर खराबता आई। कोर डेटा ने शिकायत की कि यह मेरे उदाहरण के लिए एक गलती को पूरा नहीं कर सका। कभी नहीं, वास्तव में कोई गलती नहीं थी। बस वस्तु को ताज़ा करने का कोई प्रभाव नहीं पड़ा, या तो। मुझे संदेह है कि यह एक कोर डेटा बग है जो शायद ही कोई गुदगुदी नहीं करता क्योंकि वे एनएसएससेट प्राप्त करने के लिए एसोसिएशन विधियों का उपयोग करते हैं।

मेरा फ़िक्स NSFetchedResultsController के लिए मूल संदर्भ का उपयोग करना था, जैसा कि इस प्रश्न में है, Magical Record, saving, and NSFetchedResultsController

मैं संपादन पर एक नए बच्चे के संदर्भ में डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से लपेट रहा था और इसलिए, createInContext के साथ उस संपादन संदर्भ में उदाहरणों की प्रतिलिपि बना रहा, इसलिए मुझे तर्क के लिए .parentContext जोड़ने से परे कोई अतिरिक्त काम नहीं करना पड़ा।

संयोग से, यह केवल एसोसिएशन के स्रोत के नए उदाहरणों पर हुआ। एक बार स्टार्टअप से एक उदाहरण था, उसके पास एक अस्थायी ObjectID था और कभी भी समस्या नहीं थी।

+0

क्षमा करें मुझे लगता है कि मुझे कुछ याद आया। आपकी सलाह "currentContext.parentContext" का उपयोग करके "संसाधन" बनाना है? –

+0

काफी नहीं, मैं मैजिकल रिकॉर्ड fetch * विधि को पास करता हूं। ऑब्जेक्ट सृजन (और संशोधन) एक बच्चे के संदर्भ में MR_defaultContext के साथ इसके माता-पिता के साथ होता है। – Otto

+0

उदाहरण कोड, [मॉडल fetchAllSortedBy: @ "qqq" आरोही: कोई साथ नहीं: अनुमानित समूह द्वारा: @ "qqq" प्रतिनिधि: स्वयं में कॉन्टेक्स्ट: self.managedObjectContext.parentContext]; इस मामले में, self.managedObjectContext MR_defaultContext जैसा ही है। – Otto