2009-03-15 14 views
10

मेरे पास एक कस्टम ऑब्जेक्ट है जो बस NSObject से विरासत में मिलता है। इसमें 3 सदस्य हैं - दो फ्लोट्स और NSDateकस्टम ऑब्जेक्ट्स

मेरे ऐप में इन वस्तुओं में से कई वस्तुओं के साथ एक सरणी होगी, और मुझे रनों के बीच इसे जारी रखने की आवश्यकता है। मैं यह कैसे हासिल कर सकता हूं?

मैंने SQLite डीबी का उपयोग करने के बारे में सोचा है, लेकिन मुझे लगता है कि यह थोड़ा अधिक है क्योंकि केवल एक ही क्वेरी जो मैंने कभी भी की होगी select * होगी।

एक आदर्श दुनिया में मैं एक एक्सएमएल प्लिस्ट फ़ाइल का उपयोग करना चाहता हूं। मुझे यकीन नहीं है कि अगर मैं इसे अपने कस्टम ऑब्जेक्ट के साथ कर सकता हूं। मुझे पता है कि संपत्ति सूची वस्तुओं का एक सेट है, और NSArray इसके अंतर्गत आता है, लेकिन writeToFile:atomically: केवल संपत्ति सूची ऑब्जेक्ट्स के साथ काम करता है।

किसी भी विचार की सराहना की जाएगी, धन्यवाद!

उत्तर

21

NSCoding वही करेगा जो आप चाहते हैं। मैं आपको एप्पल दस्तावेज़ों में इसे पढ़ने की सलाह देता हूं, लेकिन मैंने सोचा कि यह उपयोग करने के लिए बहुत सरल था। आपकी कक्षा (और किसी भी बच्चे कक्षा) को NSCoding प्रोटोकॉल को लागू करने की आवश्यकता होगी और आपको अपनी वस्तुओं के लिए -encodeWithCoder: और -initWithCoder: विधियों को जोड़ने की आवश्यकता होगी। अधिकांश सामान्य ढांचे वर्ग पहले से ही NSCoding लागू करते हैं।

अपनी कक्षा के लिए कोड कुछ इस तरह दिखेगा:

-(void) encodeWithCoder: (NSCoder*) coder { 
    [coder encodeInteger: versionValue forKey: versionKey]; 
    [coder encodeObject: myStuff forKey: myStuffKey]; 
} 

-(id) initWithCoder: (NSCoder*) coder { 
    self = [super init]; 
    if (! self) return nil; 
    myStuff = [[coder decodeObjectForKey: myStuffKey] retain]; 
    return self; 
} 

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

मेरी कक्षा में, मैं एक सुविधा की विधि जोड़ा मेरी वस्तु संग्रह करने के लिए:

-(void) archiveToFile: (NSString*) path { 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data]; 
    [archiver encodeObject: self forKey: myArchiveKey]; 
    [archiver finishEncoding]; 
    [archiver release]; 
    [data writeToFile: path atomically: YES]; 
    [data release]; 
} 

और एक और एक संग्रह से निकालने के लिए या एक नया वस्तु बनाने के लिए:

+(MyArchive*) newFromFile: (NSString*) path 
      orWithMyStuff: (MyStuff*) myStuff 
{ 
    NSData *data = [[NSData alloc] initWithContentsOfFile: path]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; 
    MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey]; 
    [unarchiver finishDecoding]; 

    if (myArchive) { 
    [myArchive retain]; 
    } else { 
    myArchive = [[MyArchive alloc] initWithStuff: myStuff; 
    } 
    [unarchiver release]; 
    [data release]; 
    return myArchive; 
} 

के बाद से अपने शीर्ष स्तर वस्तु एक है NSArray, आपको अपने मामले के लिए अंतिम दो विधियों को संशोधित करने की आवश्यकता होगी, लेकिन अधिकांश बॉयलरप्लेट कोड समान होंगे।

+0

और यह एक अच्छा प्लिस्ट उत्पन्न करेगा? मैं इस धारणा के तहत था कि एनएसडीएटा लिखना सिर्फ धारावाहिक डेटा उत्पन्न करेगा, न कि एक प्लास्ट। – Jasarien

+0

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

+0

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

0

यदि आप ऑब्जेक्ट्स का सबसेट पुनर्प्राप्त करना चाहते हैं, तो SQLite आपके सबसे अच्छे विकल्प से है।

यदि नहीं, तो यह प्लिस्ट प्रारूप और एनएससीओडी के बीच एक विकल्प है। प्लिस्ट के लिए आपको अपनी कस्टम ऑब्जेक्ट्स को कुछ प्लिस्ट-फ्रेंडली में बदलने में सक्षम होना चाहिए और उसके बाद प्लेलिस्ट को अपनी ऑब्जेक्ट्स में कनवर्ट करना होगा, लेकिन एनएससीओडीिंग आपके सिर को लपेटने के लिए थोड़ा कठिन है और हाथ से आसानी से संपादित नहीं किया जा सकता है (या जांच) ।

+0

मैं सबसेट का उपयोग नहीं करूँगा। मुझे बस पूरी सूची जारी रखने की जरूरत है। किसी वस्तु को प्लेलिस्ट के अनुकूल बनाने के बारे में कैसे जाना होगा? यह मेरी समझ थी कि संपत्ति सूची वस्तुओं का एक सेट है और यही वह है। मेरा ऑब्जेक्ट कुछ भी नहीं बनाया गया है जो प्लास्टेबल नहीं है ... – Jasarien

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