2009-08-05 17 views
8

में बिना किसी समय के स्टोर कैसे स्टोर करें I iPhone पर कोर डेटा का उपयोग करके दैनिक डेटा संग्रहीत करने का एक समझदार तरीका खोजने का प्रयास कर रहा हूं।कोर डेटा

मेरा ऐप एक तिथि लेकिन कुछ ही समय के साथ CSV प्रारूप में डेटा प्राप्त करता है:

date, cycles 
2009-08-01, 123 
2009-08-02, 234 
2009-08-03, 345 
2009-08-04, 456 

जब यह डेटा संग्रहीत किया जाता है, वहाँ केवल प्रति दिन एक रिकॉर्ड होना चाहिए। मैंने पाया कि एनएसडीएटी को संग्रहीत करने के लिए सबसे अच्छी चीज बनाई गई थी, लेकिन & समय क्षेत्र डेटा को बाहर निकालें।

मैं आसानी से NSDateComponents या NSDateFormatter का उपयोग करके घंटे, मिनट या सेकंड के बिना एनएसडीएट बना सकता हूं। हालांकि तब भी जब मैं समय क्षेत्र स्पष्ट रूप यूटीसी करने के लिए या GMT से शून्य सेकंड में निर्धारित करते हैं,) NSLog के साथ एक बनाया तिथि (हमेशा की तरह मेरे स्थानीय समय क्षेत्र है outputting:

2009-07-29 00:00:00 +0100 

किसी को एक बेहतर तरीका पता है समय घटकों के बिना NSDates बनाओ? या शायद तारीखों को संग्रहित करने का एक बेहतर तरीका है?

उत्तर

9

अंगूठे का एक अच्छा प्रोग्रामिंग नियम हमेशा यूटीसी में तारीखों को स्टोर करना है। इससे कोई फ़र्क नहीं पड़ता कि आप कोर डेटा का उपयोग करते हैं या नहीं; आपको अभी भी कुछ काम करना होगा क्योंकि ऐप्पल की तिथि कक्षाएं बहुत ज्यादा चूस रही हैं।

दिनांक, 1 जनवरी 2001 00:00:00 (हालांकि वास्तविक संदर्भ दिनांक बहुत महत्वपूर्ण नहीं है) के बाद दिनांकों को आंतरिक रूप से कई सेकंड के रूप में दर्शाया जाता है। प्वाइंट है, NSDate ऑब्जेक्ट्स हमेशा यूटीसी में मूल रूप से होते हैं। मैं 00:00:00 के लिए समय निर्धारित होता है तो फिर

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]]; 

,: दिनांक आप अपनी CSV फ़ाइल में हो रही है स्थानीय हैं, तो आप UTC समय प्राप्त करने के लिए कुछ इस तरह करने की आवश्यकता होगी । अब आप यूटीसी में मध्यरात्रि में तारीख को सहेज रहे हैं। प्रस्तुति उद्देश्यों के लिए, आप उन दिनांकों को प्रदर्शित करने के लिए अपनी पसंद के समय क्षेत्र के साथ कॉन्फ़िगर किए गए NSDateFormatter का उपयोग करेंगे (सिस्टम समय क्षेत्र डिफ़ॉल्ट है यदि आप एक निर्दिष्ट नहीं करते हैं)।

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

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

आपके पास यहां विकल्पों का एक टन है, और इनमें से कोई भी अपने स्वयं के SQLite प्रश्न और डेटाबेस लिखने का प्रयास शामिल नहीं करता है।

+1

बहुत बहुत धन्यवाद। मुझे अब इसे हल किया गया है। आपका उत्तर रूपांतरणों को और अधिक समझ में आता है और पीटर होसे के नीचे एनएसएलओजी आउटपुट बताते हैं। – Ben

2

एनएसडीएटी ऑब्जेक्ट हमेशा समय की तारीख को शामिल करेगा - दस्तावेज़ों को उद्धृत करने के लिए "समय में एक बिंदु का प्रतिनिधित्व करता है" और इसकी संदर्भ तिथि के बाद से समय मूल्य संग्रहीत करके (जीएमटी में 1 जनवरी 2001 की शुरुआत , फिर दस्तावेज़ों के अनुसार)। इसलिए आपके पास एनएसडीएट नहीं हो सकता है जो दिन के समय से अनजान है।

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

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

+0

उत्तर के लिए धन्यवाद। यह अभी भी समय क्षेत्र की समस्या छोड़ देता है। उदाहरण के लिए: मैं अपना डेटा जुलाई लंदन (जीएमटी +0100) में सहेजता हूं और कोई अन्य इसे कर्टर्टिनो (जीएमटी -00000) में बचाता है। संग्रहीत तिथि में अब 8 घंटे का अंतर है। मुझे लगता है कि कच्चे SQLite पर वापस जाने के लिए शायद यह अधिक कुशल है। – Ben

+0

मुझे समस्या को काफी समझ में नहीं आता है: एनएसडीएटी की तारीख को पूर्ण तिथि के रूप में संग्रहीत किया जाता है, 00:00:00 1/1/2001 * जीएमटी * के बाद से सेकंड। तो यदि अलग-अलग समय क्षेत्र में दो लोग 'वर्तमान' तारीख को उसी पल में स्टोर करते हैं, तो उनके एनएसडीएट समान हैं। टाइमज़ोन केवल पुनर्प्राप्ति/प्रदर्शन पर काम करता है, और जब तक आप NSDate को नहीं बताते हैं अन्यथा यह सिस्टम लोकेल टाइमज़ोन के साथ जाएगा। दूसरे शब्दों में, यदि आपके दो सेट डेटा लंदन और कूपर्टिनो में एक ही पल में संग्रहीत हैं, तो संग्रहीत तिथियां समान हैं, बिना किसी अंतर के। – marramgrass

3

एनएसडीएटी में समय क्षेत्र नहीं है। एनएसएलओजी आपके स्थानीय समय क्षेत्र का उपयोग करता है; यह +0100 कहता है क्योंकि वह वही है जहां आप हैं।

+0

धन्यवाद। मुझे पता नहीं था कि यह स्थानीय टाइमज़ोन का उपयोग कर एनएसएलओजी था। इस बात की ओर इशारा करने के बाद मैंने सिस्टम डेट और टाइम प्रीफ़्स के साथ कुछ और खेला और अब यह और अधिक समझ में आता है। – Ben

+0

मुझे +0100 समझ में नहीं आया। यह वास्तव में क्या प्रतिनिधित्व कर रहा है? –

+0

श्रीकांत रोंंगाली: समय क्षेत्र ऑफ़सेट। प्रश्नकर्ता जीएमटी से एक घंटा आगे था: जीएमटी +0100। (अंकों की उत्तरार्द्ध जोड़ी मिनट हैं, इसलिए समय क्षेत्र जो जीएमटी से ढाई घंटे आगे होगा +0530 होगा।) –