2011-06-07 13 views
21

में केवल चयनित संपत्ति प्राप्त करना संभव है मेरे पास (मुझे लगता है) सामान्य समस्या है। मेरे कोर डेटा डेटाबेस में टेबल है, जिसमें बीएलओबी फ़ील्ड और काफी लंबे टेक्स्ट फ़ील्ड हैं।क्या कोर डेटा क्वेरी

आमतौर पर मुझे उन बड़े आकार के क्षेत्रों में agrresivly लोड करने की आवश्यकता नहीं है। चूंकि डेटाबेस में कई हज़ार रिकॉर्ड हैं, इसलिए मैं केवल उन्हीं डेटा को प्राप्त करना पसंद करूंगा जो मुझे सचमुच चाहिए। दूसरे शब्दों में, मैं "चयन नाम, आईडी से TAB_NAME" क्वेरी बनाना चाहता हूं, "TAB_NAME से चुनें * क्वेरी" नहीं।

क्या कोर डेटा का उपयोग करके केवल चयनित फ़ील्ड लाने का कोई तरीका है? या मैं कुछ अन्य विकल्प की तलाश करूंगा, उदाहरण के लिए, बड़े फ़ील्ड को किसी अन्य तालिका में अलग करना? शायद ऐसा करने के लिए एक बेहतर (आसान) तरीका है?

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

उत्तर

34

दूसरे शब्दों में मैं "चयन करें, आईडी से TAB_NAME" क्वेरी बनाना चाहता हूं, न कि "TAB_NAME से चुनें" क्वेरी।

इस सवाल का जवाब स्वीकार कर लिया गया है, लेकिन FYI करें, यहाँ कोर डेटा के साथ एक इकाई के केवल विशिष्ट गुण लाने का तरीका बताया गया, अपने मॉडल को पुन बाँटे बिना: के लिए

// build your NSFetchRequest 
// ... 

[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToFetch: 
    [NSArray arrayWithObjects:@"property1", @"property2", /* etc. */ nil]];  

भी देखें प्रलेखन NSFetchRequest

+0

तनख्वाह, यह वही है जो मुझे –

+0

बीटीडब्ल्यू की आवश्यकता है, दस्तावेज़ों के अनुसार, आपको 'NSPropertyDescription' ऑब्जेक्ट्स की एक सरणी पास करनी चाहिए। –

+1

@RudolfAdamkovic 'NSFetchRequest.h' हेडर फ़ाइल में देख रहे हैं, यह वास्तव में सुझाव देता है कि सरणी * या * * एनएसपीप्रर्टी डिस्क्रिप्शन' * या * 'एनएसएसटींग 'ऑब्जेक्ट्स का संग्रह हो सकती है। –

3

कोर डेटा faulting के रूप में पहले से ही "आलसी लोडिंग" करता है: दोषों को केवल स्टोर से डेटा खींचते हैं जब आपको इसकी आवश्यकता होती है, जो स्मृति और प्रदर्शन ओवरहेड को कम कर देता है। इसके अलावा अधिक जानकारी के लिए Core Data Performance दस्तावेज़ पढ़ें:

एक बूँद अक्सर एक इकाई-उदाहरण के लिए की एक विशेषता का प्रतिनिधित्व करता है, एक तस्वीर एक कर्मचारी इकाई की एक विशेषता हो सकता है। छोटे से छोटे आकार के बीएलओबी (और सीएलओबी) के लिए, आपको डेटा के लिए एक अलग इकाई बनाना चाहिए और विशेषता के स्थान पर एक-एक संबंध बनाना चाहिए। उदाहरण के लिए, आप कर्मचारी और फोटोग्राफ इकाइयों को उनके बीच एक-एक-एक रिश्ते के साथ बना सकते हैं, जहां कर्मचारी से फोटोग्राफ का संबंध कर्मचारी की फोटोग्राफ विशेषता को बदल देता है। यह पैटर्न ऑब्जेक्ट फॉल्टिंग के लाभ को अधिकतम करता है (देखें "फॉल्टिंग और यूनिकिंग")। किसी भी दी गई तस्वीर को केवल तभी प्राप्त किया जाता है जब वास्तव में इसकी आवश्यकता होती है (यदि रिश्ते को पार किया जाता है)।

+3

हां, लेकिन गलती सभी क्षेत्रों को किसी दिए गए ऑब्जेक्ट के लिए लाएगी, है ना? दस्तावेज़ों से: "यदि आप विभाग को संदेश लिखने के लिए संदेश भेजते हैं, तो उसका नाम, तो गलती आग लगती है- और इस स्थिति में कोर डेटा आपके लिए सभी ऑब्जेक्ट के गुणों को पुनर्प्राप्त करने के लिए एक फ़ेच निष्पादित करता है।" –

+0

आप सही हैं। कृपया संपादित उत्तर देखें। –

+1

ऐसा लगता है जैसे एंड्रे सही है, आलसी लोडिंग रिश्ते के बारे में है –

3

मुझे लगता है कि इस मामले में आप एक अलग इकाई पर बड़े फ़ील्ड (जिन्हें आप लोड नहीं करना चाहते हैं) रखना चाहते हैं, और इसके लिए केवल 1: 1 संबंध बनाएं। इस तरह, भले ही आप अपनी वस्तु को गलती करते हैं, आप केवल "लाइटर" विशेषताओं को लाएंगे, और उन भारी लोगों को लाने के लिए जो आप रिश्ते का उपयोग करेंगे।