2010-08-10 13 views
6

से एक वस्तु पुनः प्राप्त मैं अपने कोर डाटा डेटास्टोर से एक वस्तु प्राप्त करना चाहते हैं, यहाँ कोड मैं का उपयोग किया गया है, लेकिन यह वस्तुओं की एक सरणी देता है, वहाँ एक सरल और बेहतर तरीका होना चाहिए:NSFetchRequest

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
+0

[अनुरोध सेटफेटचलिमिट: 1] लौटाई गई वस्तुओं की संख्या को सीमित कर सकता है, हालांकि आपको अभी भी एनएसएआरएआरई मिल जाएगी। – magma

उत्तर

8

अपने विधेय हमेशा एक से अधिक परिणाम हासिल करेगा हैं:

  • विधेय को परिष्कृत - मत भूलना आप की तरह और/या सरल, समानता के लिए आसान है तर्क के साथ विधेय निर्माण कर सकते हैं, लेकिन नहीं में काफी चयनात्मक हो सकता है आपका मुकदमा।

  • सिर्फ परिणाम आप सरणी से चुनें, यह कोई बड़ी बात नहीं है - हालांकि अगर यह संभव हो सकता है यह भी विधेय परिष्कृत करने के लिए संभव हो जाना चाहिए ...

  • ताकि आपके डेटा मॉडल का पुनर्गठन पर विचार आप केवल एक आइटम वापस पाने के लिए भविष्य को परिष्कृत कर सकते हैं।

fetch हमेशा एक सरणी देता है, यह इसकी परिभाषा है। हालांकि यह एक वस्तु का सरणी हो सकता है।

+0

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

6

यह हमेशा एक सरणी वापस आ जाएगी लेकिन आप इसे क्लीनर बना सकते हैं:

NSFetchRequest *request= [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

NSError *error; 
//Making a mutable copy here makes no sense. There is never a reason to make this mutable 
//NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
id manufacturer = [[managedObjectContext executeFetchRequest:request error:&error] lastObject]; 
request = nil; 
NSAssert1(error && !manufacturer, @"Error fetching object: %@\n%@", [error localizedDescription], [error userInfo]); 

-lastObject सरणी या नहीं के बराबर में अंतिम आइटम वापस आ जाएगी अगर सरणी खाली है। यह आपके कोड को थोड़ा क्लीनर रखता है जब आप जानते हैं कि सरणी में एक ऑब्जेक्ट होने वाला है या यदि आपको कोई परवाह नहीं है कि आप किस ऑब्जेक्ट को सरणी से बाहर खींचते हैं।

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

+0

तो mutableCopy के बजाय जब मैं सरणी में सभी तत्वों को चाहता हूं तो मुझे इसके बजाय क्या उपयोग करना चाहिए? इसके अलावा मैंने केवल अपने मूल डेटा मॉडल में इकाइयों के संपत्ति नामों पर राजधानियों का उपयोग किया, अन्यथा मैं लोअरकेस का उपयोग करता हूं। – Slee

+0

प्रश्न में आपके कोड में आपके पास 'निर्माता आईडी' है इसलिए इस भाग पर मेरी टिप्पणी :) आपकी दूसरी प्रतिलिपि के लिए, '-executeFetchRequest: त्रुटि:' एक सरणी देता है। आपको इसके साथ कुछ और करने की ज़रूरत नहीं है। कॉलिंग '-मुटेबल कॉपी' सिर्फ इसे 'एनएसएमयूटेबलएरे' में बदल देती है जो कोर डेटा से लौटाए गए 'एनएसएआरएआरई' के साथ काम करते समय कुछ भी उपयोगी नहीं होती है। उस सरणी में जोड़ना कोर डेटा में ऑब्जेक्ट्स नहीं जोड़ देगा; उस सरणी से ऑब्जेक्ट्स को निकालने से उन्हें कोर डेटा से नहीं हटाया जाएगा। –

0

fetchRequest.fetchLimit = 1 आज़माएं। आपको अभी भी एक सरणी मिलती है, लेकिन अधिकतम 1 ऑब्जेक्ट के साथ।

+0

मैंने 'कोर डेटा 'ऑब्जेक्ट्स के लिए' fetchLimit == 1' को आजमाया। यह बस –

+0

काम नहीं करता है यह सही काम करता है। – user1447414

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