2010-09-26 21 views
32

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

मैंने जो किया है, मैंने अभी पीओआई नाम की इकाई बनाई है और कुछ अन्य लोगों के साथ अक्षांश (डबल टाइप), रेखांश (डबल टाइप) जैसे गुण जोड़े हैं।

बस शब्दों में कहें, मेरा ऐप दो एनएसएनबर्स के साथ पीओआई बचाता है। (लेट और लांग) लेकिन मुझे लगता है कि CLLocation को स्टोर करने के लिए एक बेहतर तरीका होना चाहिए।

चीयर्स।

उत्तर

34

आप जो कर रहे हैं वह ठीक है। आपको कोर डेटा में अक्षांश और देशांतर को युगल के रूप में सहेजना चाहिए। जब आपको जानकारी फिर से प्राप्त करने की आवश्यकता होती है, तो कोर डेटा से युगल वापस प्राप्त करें और CLLocationCoordinate2DMake जैसे फ़ंक्शन के साथ CLLocationCoordinate2D संरचना बनाएं। स्थान को स्टोर करने के लिए कोई भी तरीका नहीं बनाया गया है, इसलिए अक्षांश और देशांतर घटकों को संग्रहीत करना ठीक है।

यदि आप अक्षांश या देशांतर (बाध्यकारी बक्से आदि ढूंढना) पर कोई गणित संचालन नहीं कर रहे हैं तो आप उन्हें तारों के रूप में स्टोर कर सकते हैं। फ्लोट्स और युगल उनके मूल्यों को थोड़ा बदल सकते हैं, तुलनात्मक संचालन विफल हो जाते हैं।

+0

धन्यवाद नेवन, असल में मैंने एनआईएसटीआरिंग में उन निर्देशांक मूल्यों को बचाया और साथ ही UILabel में प्रदर्शित किया। मेरे पास निर्देशांक के साथ कुछ गणित करने की योजना है लेकिन मुझे नहीं पता था कि "फ्लोट्स और युगल उनके मूल्यों को थोड़ा बदल सकते हैं, तुलनात्मक संचालन विफल हो जाते हैं।" जो मुझे मामूली परिवर्तन के साथ मूल प्रश्न पर वापस लाता है; यदि आपको दूरी की गणना करने और तुलना करने की आवश्यकता है, तो कोर डेटा का उपयोग करके CLLocation समन्वय मूल्यों को स्टोर करने का सबसे अच्छा तरीका क्या है? – bicbac

+2

यदि आप उन पर कुछ गणना कर रहे हैं, जैसे 12.34 से अधिक अक्षांश ढूंढना, तो मैं उन्हें फ्लोट या युगल के रूप में स्टोर करूंगा। बस इसे स्टोर करने और इसे लाने के बीच फ्लोट वैल्यू पर भरोसा न करें। यदि आप यह सुनिश्चित करना चाहते हैं कि मान परिवर्तित नहीं होता है (यहां तक ​​कि एक छोटे से अंश द्वारा) दशमलव का उपयोग करें। मुझे यकीन नहीं है कि दशमलव प्रकार के साथ गणित करना कितना तेज़ है। यहां एक लिंक दिया गया है: http://stackoverflow.com/questions/159255/what-is-the-ideal-data-type-to-use-when-storing-latitude-longitudes-in-a-mysql/159333#159333 –

+2

यदि आपको संख्यात्मक मूल्यों को बड़ी परिशुद्धता के साथ स्टोर करने और उन पर संचालन करने की आवश्यकता है तो आपको NSDecimal संख्या का उपयोग करना चाहिए। कोर डेटा में स्टोर करने के लिए एक मूल्य ट्रांसफॉर्मर का उपयोग करें। हालांकि, मुझे लगता है कि इस मामले में अधिक होगा। फ़्लोट्स और युगल मूल्यों को बदल सकते हैं, लेकिन केवल उनकी परिशुद्धता के बहुत से चरम पर। अक्षांश/रेखांश केवल दाईं ओर अधिकतम 4 दशमलव स्थानों की आवश्यकता होती है ताकि आप अपने महत्वपूर्ण अंकों को पूरी तरह से स्टोर और उन मूल्यों को फ्लोट के साथ पुनर्प्राप्त करने के लिए नियंत्रित कर सकें। – TechZen

26

CLLocation एनएससीओडिंग प्रोटोकॉल लागू करता है ताकि आप उन्हें कोर डेटा में परिवर्तनीय विशेषताओं के रूप में स्टोर कर सकें। आप डिफ़ॉल्ट NSKeyedUnarchiveFromData मान ट्रांसफॉर्मर का उपयोग कर सकते हैं।

आप सीसीएलोकेशन ऑब्जेक्ट को प्रबंधित ऑब्जेक्ट विशेषता में पास कर देंगे और यह डेटा को क्रमबद्ध करेगा और इसे एसक्यूएल स्टोर में ब्लॉब के रूप में स्टोर करेगा। जब आपको स्थान ऑब्जेक्ट की आवश्यकता होती है तो यह स्वचालित रूप से प्रक्रिया को उलट देता है और आपके पास पूरी तरह से आबादी वाले CCLocation ऑब्जेक्ट पर वापस आ जाता है।

यह जो भी आप चाहते हैं पाने के लिए सबसे आसान तरीका हो सकता है।

+14

यदि डेटा क्रमबद्ध है, तो आप स्टोर से प्रत्येक स्थान प्राप्त किए बिना बाउंडिंग बॉक्स के भीतर स्थान प्राप्त नहीं कर पाएंगे। –

+0

आसान हो सकता है लेकिन उस प्रारूप में संग्रहीत होने पर क्वेरी नहीं कर सकता। – malhal

17

"सर्वश्रेष्ठ" जिस तरह से स्टोर करने के लिए यह क्या आप इसके साथ क्या करना चाहते हैं पर निर्भर करता है:

  • आप "एक ही" CLLocation चाहते हैं, यह क्रमानुसार। NSKeyedUnarchiveFromData ठीक है।
  • यदि आप अक्षांश और देशांतर पर खोजना चाहते हैं, तो उन्हें युगल के रूप में स्टोर करें (और "अनुक्रमित" चेकबॉक्स को चेक करें)।

यदि आप मैन्युअल रूप से ऐसा करते हैं तो आप अतिरिक्त गुणों का एक गुच्छा बचा सकते हैं/पुनर्स्थापित कर सकते हैं (ऊंचाई, क्षैतिज सटीकता, लंबवत सटीकता, टाइमस्टैम्प)। कुछ और हैं जो आप नहीं कर सकते (गति, शीर्षक); CLLocation एक उपयुक्त init-method प्रदान नहीं करता है और गुण केवल पढ़ने के लिए हैं।

यदि आप ट्रैक रिकॉर्ड कर रहे हैं तो सभी अतिरिक्त गुण उपयोगी हैं। ऊंचाई आप उपयोगी हैं यदि आप पहाड़ी इलाके पर पीओआई रिकॉर्ड कर रहे हैं ("हमें अभी भी 100 मीटर चढ़ना है")। क्षैतिज/ऊर्ध्वाधर सटीकता का उपयोग यह दर्शाया जा सकता है कि पीओआई कितना बड़ा है (उदाहरण के लिए एक शहर में कई किमी की "क्षैतिज सटीकता" हो सकती है और एक बड़े सर्कल के रूप में प्रदर्शित किया जा सकता है)।

2

आप कोर डेटा विशेषता प्रकार को Transformable पर सेट करके बस इतना ही कर सकते हैं। यदि आप वैल्यू ट्रांसफार्मर नाम खाली छोड़ते हैं तो डिफ़ॉल्ट ट्रांसफार्मर NSKeyedArchiver है जो अधिकांश फाउंडेशन प्रकारों जैसे NSURL और CLLocation के साथ काम करता है।

0

अक्षांश और देशांतर बिंदुओं को संग्रहीत करने के लिए आपको NSNumber का उपयोग करने की आवश्यकता नहीं है। आप CLLocation को सीधे इसके बजाय कोर डेटा पर स्टोर कर सकते हैं।

प्रत्येक सीएलएलोकेशन के लिए एक इकाई सेट अप करें, यह स्थान बिंदुओं का उपयोग कर रहे किसी भी इकाई से बहुत अधिक रिलेशनशिप होगा। चलो इस LocationPoint कहते हैं:

class LocationPoint: NSManagedObject { 

@NSManaged var game: NSNumber 
@NSManaged var time: NSDate 
@NSManaged var location: AnyObject 

} 

फिर आप Xcode डाटा मॉडल में बदला जाने के लिए स्थान गुण सेट। बस!

ऑब्जेक्टिव-सी में आप वास्तव में अभी भी किसी भी त्रुटि के बिना CLLocation के रूप में इस LocationPoint संपत्ति की घोषणा कर सकते हैं:

@property (nonatomic, strong) CLLocation *location 

More info here

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