2009-09-30 19 views
12

द्वारा आदेशित स्थानों की एक सूची लाने के लिए coredata का उपयोग कैसे करें मेरे पास एक कॉर्डटा आधारित आईफोन ऐप है और एक ऐसी इकाई है जिसमें गुणों के रूप में अक्षांश और अक्षांश है। वर्तमान स्थान से दूरी से आदेशित मेरी सभी संस्थाओं को मैं कैसे वापस कर सकता हूं? मैंने previosuly यह एक sql क्वेरी लिखने के बिना coredata के बिना किया, लेकिन coredata के लिए नया हूँ और इसे समझ नहीं सकता। मैं सीधे अपने टेबलव्यू पर जाने के लिए NSFetchedResultsController का उपयोग करना चाहता हूं।दूरी

कोई मदद कृपया?

उत्तर

2

मेरे पास एक समान स्थिति है - और हालांकि उपर्युक्त NSFetchedResultsController का उपयोग करने में सक्षम नहीं होने के संबंध में सत्य है, फिर भी आप अपने डेटा को पुनर्प्राप्त करने के लिए कोर डेटा का उपयोग कर सकते हैं।

मैंने पहले एसक्लाइट 3 का भी उपयोग किया - और मेरा fetch बढ़ते बाउंडिंग बॉक्स आकारों के fetches की श्रृंखला के रूप में किया गया था - एक आकार तक पहुंचने तक, जहां मेरे पास 'पर्याप्त' परिणाम हैं। मेरे मामले में मैं प्रत्येक पुनरावृत्ति के लिए अक्षांश और देशांतर अवधि को दोगुना करता हूं - लगभग दे रहा हूं। प्रत्येक पुनरावृत्ति के लिए क्षेत्र की चौगुनी।

यह विधि कोर डेटा में भी ठीक काम करती है - लेकिन जैसा कि ऊपर बताया गया है, आपको वस्तुओं को एक नई सरणी में कॉपी करने की आवश्यकता है और उन्हें प्राप्त करने के बाद अपनी विधि का उपयोग करके सॉर्ट करना होगा।

+0

मुझे लगता है कि मैं ऐसा कुछ खत्म कर दूंगा। मुझे लगता है कि इसे सब कुछ मुफ्त में प्राप्त करने के बजाय मुझे थोड़ा सा काम करना होगा :-) सीओआरटी का उपयोग सीधे सीओआरडीएटी के साथ मुझे बीमार महसूस कर रहा है। –

1

ठीक है, यहां समस्या है: जब आप NSFetchRequest निष्पादित करते हैं, तो आप केवल निरंतर गुणों पर अनुमान लगा सकते हैं। ऐसा लगता है कि आपके पास एक सतत संपत्ति होगी जो वर्तमान स्थान से दूरी को ट्रैक करेगी।

आप अपनी इकाई में एक क्षणिक संपत्ति जोड़ सकते हैं जो कुछ वैश्विक स्तर पर परिभाषित स्थान से दूरी प्रदान करता है। आपको एक लाने का अनुरोध करना होगा जो सभी वस्तुओं को प्राप्त करे, और फिर उन्हें इस क्षणिक संपत्ति द्वारा आदेश दें।

यदि आपके पास बहुत सारी वस्तुएं हैं, तो आप अपनी याददाश्त को जल्दी से भरने का जोखिम चलाते हैं। और यदि आप नहीं करते हैं, तो भी आप उन वस्तुओं को लाने में समय बर्बाद कर देंगे जो आप कभी भी उपयोग नहीं करेंगे।

मुझे लगता है कि आपके पास शायद निफ्टी एसक्यूएल SELECT कथन था जो आपके पिछले संस्करण में वर्तमान दूरी की गणना करता था। आप कोर डेटा के साथ इसे दोहराने में सक्षम नहीं होंगे।

+0

मैं लगा कि मामला होगा, हालांकि मैं हालांकि शायद मैं एक तरह से समारोह है कि अक्षां और लंबे समय के लिए गणना की प्रेषित कर सकता है,:

कोड स्निपेट कि निर्देशांक के 2 के बीच की दूरी सेट की गणना करता है लेकिन ऐसा लगता है कि आप नहीं कर सकते। यह सब सच होने के लिए बहुत अच्छा लगा :-) यदि मैं SQLLite का उपयोग कर रहा हूं, तो मुझे लगता है कि मैं coredata को बाईपास कर सकता हूं और अपनी एसक्यूएल क्वेरी के साथ चिपक सकता हूं। धन्यवाद। –

8

मेरे अनुभव में ऐसा करने का सबसे अच्छा तरीका है पहली लोड (या स्थान परिवर्तन) पर प्रत्येक प्रविष्टि की दूरी की गणना करना और उस संपत्ति को कोरडाटा में सहेजना, इस तरह आप दूरी संपत्ति का उपयोग करके आसानी से प्रविष्टियां प्राप्त कर सकते हैं। ,

for(SWShow *show in shows) { 
    CLLocation *showLocation = [[CLLocation alloc] initWithLatitude:show.latitude longitude:show.longitude]; 
    double distance = [currentLocation distanceFromLocation:showLocation]/1000 // in km 
    show.distance = @(distance); 
} 

[managedObjectContext save]; 
+0

यह महत्वपूर्ण स्थान परिवर्तनों के बाद अद्यतन करने के लिए पृष्ठभूमि कार्य के साथ संयुक्त है एक अच्छा समाधान है। – Dane

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