2012-01-04 11 views
15

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

मुझे यह डेटा कैसे सहेजना चाहिए? सबसे पहले इन वस्तुओं को मॉडल करना आवश्यक है? अगर मुझे संपत्ति सूचियों का उपयोग नहीं करना चाहिए? या SQLLite3?

अन्यथा मुझे कक्षा मॉडल संग्रहित करना चाहिए? SQLLite3 का प्रयोग करें?

संपादित करें: मैंने गलती से ऐप के बारे में कुछ महत्वपूर्ण जानकारी छोड़ी है। असल में मेरे ऐप में 2 डेटा मॉडल होंगे जिनके साथ एक समेकित संबंध होगा। तो मेरा पहला डेटा मॉडल (इसे डेटाए को कॉल करने देता है) जिसमें एनएसएसटींग और एनएसडीएटी के पास दूसरे डेटा मॉडल का संदर्भ होगा (इसे डेटाबी कहते हैं) जिसमें स्वयं एनएसएसटींग और एनएसएआरएआरई शामिल होगा। तो अब यह थोड़ा और जटिल हो जाता है। यदि डेटाबी से कोई ऑब्जेक्ट हटा दिया जाता है तो यह निश्चित रूप से डेटाए में मौजूद होना चाहिए (लेकिन शेष डेटा ए को छूटा जाना चाहिए)

+0

यदि डेटा की मात्रा बड़ी नहीं है, जैसा कि आप कह रहे हैं .. आप NSUserDefaults का उपयोग कर सकते हैं ... इसका सरल और उपयोग करने में आसान है। – Bonnie

उत्तर

17

इस प्रकार का डेटा स्टोर करना और पुनर्प्राप्त करना बहुत आसान लगता है और कोई अन्य नहीं है एक भयानक जटिल वस्तु ग्राफ जैसे निर्भरता।

आपको इस डेटा को एक फ्लैट फ़ाइल में या NSUserDefaults में स्टोर करना चाहिए।

मैं तुम दोनों का एक उदाहरण, NSCoding प्रोटोकॉल के उपयोग के साथ वस्तु संग्रह का उपयोग कर देंगे:

@interface ApplicationData <NSCopying, NSCoding> {} 

@property (nonatomic, strong) NSDate *someDate; 
@property (nonatomic, strong) NSDate *someOtherDate; 

@property (nonatomic, copy) NSString *someString; 
@property (nonatomic, copy) NSString *someOtherString; 

@end 

@implementation ApplicationData 

@synthesize someDate = _someDate, someOtherDate = _someOtherDate, someString = _someString, someOtherString = _someOtherString; 

- (NSArray *)keys { 
    static dispatch_once_t once; 
    static NSArray *keys = nil; 
    dispatch_once(&once, ^{ 
     keys = [NSArray arrayWithObjects:@"someString", @"someOtherString", @"someDate", @"someOtherDate", nil]; 
    }); 
    return keys; 
} 

- (id) copyWithZone:(NSZone *) zone { 
    ApplicationData *data = [[[self class] allocWithZone:zone] init]; 
    if(data) { 
     data.someString = _someString; 
     data.someOtherString = _someOtherString;  

     data.someDate = _someDate; 
     data.someOtherDate = _someOtherDate; 
     //... 
    } 
    return data; 
} 

- (void) encodeWithCoder:(NSCoder *) coder { 
    [super encodeWithCoder:coder]; 

    NSDictionary *pairs = [self dictionaryWithValuesForKeys:[self keys]]; 

    for(NSString *key in keys) { 
     [coder encodeObject:[pairs objectForKey:key] forKey:key]; 
    } 
    } 


    - (id) initWithCoder:(NSCoder *) decoder { 
    self = [super initWithCoder:decoder]; 
    if(self) { 
     for(NSString *key in [self keys]) { 
      [self setValue:[decoder decodeObjectForKey:key] forKey:key]; 
     } 
    } 
    return self; 
    } 

    @end 

फिर, अपने आवेदन प्रतिनिधि में कहते हैं, आप ऐसा कर सकते हैं:

@interface AppDelegate (Persistence) 

@property (nonatomic, strong) ApplicationData *data; 

- (void)saveApplicationDataToFlatFile; 
- (void)loadApplicationDataFromFlatFile; 
- (void)saveApplicationDataToUserDefaults; 
- (void)loadApplicationDataFromUserDefaults; 

@end 

@implementation AppDelegate (Persistence) 
@synthesize data; 

- (NSString *)_dataFilePath { 
    static NSString *path = nil; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
    path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) stringByAppendingPathComponent:@"xAppData.dat"]; 
    }); 
    return path; 
} 

- (void)loadApplicationDataFromUserDefaults {   
    NSData *archivedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"appData"]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToUserDefaults { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [[NSUserDefaults standardUserDefaults] setObject:archivedData forKey:@"appData"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

- (void)loadApplicationDataFromFlatFile { 
    NSData *archivedData = [NSData dataWithContentsOfFile:[self _dataFilePath]]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToFlatFile { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [archivedData writeToFile:[self _dataFilePath] atomically:YES]; 
} 

@end 

अस्वीकरण: मैंने इस कोड का परीक्षण नहीं किया है।

+0

आपके संपूर्ण उत्तर के लिए धन्यवाद। असल में मेरे ऐप में 2 डेटा मॉडल होंगे जिनके साथ एक समेकित संबंध होगा। तो मेरा पहला डेटा मॉडल (इसे डेटाए को कॉल करने देता है) जिसमें एनएसएसटींग और एनएसडीएटी के पास दूसरे डेटा मॉडल का संदर्भ होगा (इसे डेटाबी कहते हैं) जिसमें स्वयं एनएसएसटींग और एनएसएआरएआरई शामिल होगा। तो अब यह थोड़ा और जटिल हो जाता है। यदि डेटाबी से कोई ऑब्जेक्ट हटा दिया जाता है तो यह निश्चित रूप से डेटाए में मौजूद होना चाहिए। –

+0

@ पीटर वार्बो यदि ऐसा है, तो मैं आपको कोर डेटा का उपयोग करने की सलाह दूंगा क्योंकि यह कैस्केडिंग रिलेशनशिप नियमों और ऐसे करने का सबसे आसान तरीका होगा। इसे लागू करने के लिए गंदगी सरल होना चाहिए, हालांकि मुझे ऐसा करने के लिए कोर डेटा स्टैक स्थापित करने के व्यापार के बारे में संदेह है ... –

+0

तो मूल रूप से यह मेरे डेटा मॉडल के संग्रह या कोर डेटा का उपयोग करके या तो उबलता है? –

1

मैं सुझाव दूंगा कि आप NSUserDefaults के साथ जाएं। यह निश्चित रूप से आपके ऐप से संबंधित जानकारी और किसी ऐप से संबंधित डेटा को स्टोर करने का सबसे अच्छा तरीका है। documentation जांचें !!

1

एनएसयूसर डीफॉल्ट अच्छा विकल्प है यदि आपके पास डेटा का केवल सीमित सेट है। लेकिन यदि आप फ़िल्टरिंग और फ़ेचिंग पर विचार करते हैं, तो आपको वस्तुओं को संग्रहीत करने के लिए कोर डेटा को देखना चाहिए।

यदि ऑब्जेक्ट ग्राफ़ न्यूनतम है तो भी आपको कैश ऑब्जेक्ट प्रबंधन और निःशुल्क पूर्ववत/पुनः प्रबंधन प्राप्त होगा।

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