2012-01-09 9 views
17

मेरे पास ऐप स्टोर पर संस्करण 1.0 के साथ एक ऐप है जो डेटा पढ़ने के लिए एसक्लाइट डेटाबेस का उपयोग करता है।
अब मैं डेटाबेस संस्करण में अद्यतन के साथ 1.1 में अपना संस्करण अपडेट करना चाहता हूं।
जब मैं डिवाइस पर ऐप इंस्टॉल करता हूं तो डेवलपर प्रमाणपत्र का उपयोग करते समय यह डेटाबेस को अद्यतन नहीं करता क्योंकि डेटाबेस फ़ाइल दस्तावेज़ फ़ोल्डर में पहले से मौजूद है इसलिए मुझे ऐप को मैन्युअल रूप से हटा देना है और इसे फिर से इंस्टॉल करना है।
मेरा सवाल यह है कि, जब कोई उपयोगकर्ता ऐप अपडेट करता है, तो डेटाबेस भी मौजूदा संस्करण के अनुसार अपडेट हो जाएगा।
कोई भी सुझाव स्वागत है।
धन्यवादएसकलाइट डेटाबेस अपडेट जब ऐप संस्करण आईफोन में ऐपस्टोर पर बदलता है

+0

क्या डेटा केवल पढ़ने या पढ़ने/लिखने के लिए है? –

+0

डेटा केवल पढ़ा जाता है। –

उत्तर

14

मुझे यकीन है कि वहाँ इस (और कई मायनों में बेहतर तो मेरा भी) ऐसा करने के लिए कई तरीके हैं, लेकिन जिस तरह से है कि मैं इस तरह की समस्याओं को संभालने के इस प्रकार है:

सबसे पहले मैं में एक निरंतर परिभाषित एप्लिकेशन (एक है कि पहले से लोड होगा) के पहले ज फ़ाइल पहली बार लोड से संकेत मिलता है और 0 के लिए सेट करने के लिए:

#define FirstTime 0 

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

//if first time run of this version 
if([MyDataModel sharedInstance].count < (FirstTime + 1)) 
{ 
    //do what you need to do as the first time load for this version 

    [MyDataModel sharedInstance].count++ 
    //save the count value to disk so on next run you are not first time 
    //this means count = 1 
} 

अब चाल अपने नए ऐप्लिकेशन संस्करण (1.1 कहते हैं) पर है: viewDidLoad में मैं निम्नलिखित परीक्षण करना। मैं बदल FirstTime 2 करने के लिए:

#define FirstTime 2 

के बाद से डिस्क पर सहेजी गई पहली बार मान 1 है इसका मतलब है कि आप ऊपर अगर बयान से पकड़ा जाएगा, इसलिए इसके अंदर आप कुछ भी कर सकते आप पुराने टेबल हटाना चाहते चाहते हैं और नए गठन के साथ फिर से उन्हें फिर से बनाएँ।

फिर वह शानदार नहीं है, लेकिन मामला हल करता है!

6

आप .plist रूप में अच्छी तरह का उपयोग कर सकते हैं:

- (void)isItTheFirstTimeAfterUpdate { 
    NSString *versionnum; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, 
                 YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourplist.plist"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if(![fileManager fileExistsAtPath:path]) { 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:@"yourplist" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:path error:&error]; 
    } 

    NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; 
    versionnum = @""; 
    //it can be installed by user (for ex. it is 1.3 but first installed), no plist value is set before 
    if(([savedStock objectForKey:@"versionnum"]) && (![[savedStock objectForKey:@"versionnum"] isEqualToString:@""])){ 
     versionnum = [savedStock objectForKey:@"versionnum"]; 
    } 

    //to get the version of installed/updated-current app 
    NSString *myversion = [NSString stringWithFormat:@"%@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]; 
    //if no version has been set-first install- or my version is the latest version no need to do sth. 
    if ([versionnum isEqualToString:myversion] || [versionnum isEqualToString:@""]) { 
     NSLog(@"Nothing has to be done"); 
    } 
    else { 
     [self cleanDB];//i have clean tables and create my new db tables maybe logout the user etc. 
     [savedStock setObject:[NSString stringWithString:myversion] forKey:@"versionnum"];//setting the new version 
     [savedStock writeToFile:path atomically:YES]; 
    } 
} 

और आप अपनी पसंद आवेदन लांच में या अपने मुख्य दृश्य नियंत्रक के दृश्य नियंत्रक में समारोह कॉल कर सकते हैं ..।

उम्मीद है कि यह मदद करता है।

12

यह दृष्टिकोण NSUserDefaults पर निर्भर करता है। विचार NSUserDefaults से पिछले ऐप संस्करण संख्या (यदि मौजूद है) प्राप्त करना है और वर्तमान संस्करण के साथ इसकी तुलना करें।

कोड वर्तमान संस्करण की तुलना में पिछले ऐप संस्करण < या पिछले संस्करण nil है, तो कोड डीबी अपग्रेड करता है। इसका अर्थ यह है कि इस दृष्टिकोण का उपयोग किया जा सकता है भले ही ऐप पहले से ही ऐपस्टोर पर प्रकाशित हो। यह ऐप अपडेट के दौरान डेटाबेस को नए संस्करण में अपग्रेड करेगा।

enter image description here

वहाँ एक सरणी जो संस्करण संख्या और इसी उन्नयन संस्करण के लिए एसक्यूएल क्वेरी के एक सेट से बना है:

यह एक plist फ़ाइल है। मान लीजिए कि पिछले संस्करण 1.2 है और वास्तविक संस्करण 1.4 है, कोड केवल संस्करण 1.2 से 1.4 तक अपग्रेड करता है। यदि पिछले संस्करण 1.3 है और वर्तमान 1.4 कोड केवल 1.3 से 1.4 तक अपग्रेड करता है। यदि पिछले संस्करण शून्य है तो कोड 1.1 तक अपग्रेड करता है तो 1.2 से फिर 1.3 और अंततः 1.4 तक।

NSString * const VERSION_KEY = @"version"; 

-(void)upgradeDatabaseIfRequired{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *previousVersion=[defaults objectForKey:VERSION_KEY]; 
    NSString *currentVersion=[self versionNumberString]; 

    if (previousVersion==nil || [previousVersion compare: currentVersion options: NSNumericSearch] == NSOrderedAscending) { 
     // previous < current 
     //read upgrade sqls from file 
     NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"UpgradeDatabase" ofType:@"plist"]; 
     NSArray *plist = [NSArray arrayWithContentsOfFile:plistPath]; 


     if (previousVersion==nil) {//perform all upgrades 
      for (NSDictionary *dictionary in plist) { 
       NSString *version=[dictionary objectForKey:@"version"]; 
       NSLog(@"Upgrading to v. %@", version); 
       NSArray *sqlQueries=[dictionary objectForKey:@"sql"]; 
       while (![DB executeMultipleSql:sqlQueries]) { 
        NSLog(@"Failed to upgrade database to v. %@, Retrying...", version); 
       }; 
      } 
     }else{ 
      for (NSDictionary *dictionary in plist) { 
       NSString *version=[dictionary objectForKey:@"version"]; 
       if ([previousVersion compare: version options: NSNumericSearch] == NSOrderedAscending) { 
        //previous < version 
        NSLog(@"Upgrading to v. %@", version); 
        NSArray *sqlQueries=[dictionary objectForKey:@"sql"]; 
        while (![DB executeMultipleSql:sqlQueries]) { 
         NSLog(@"Failed to upgrade database to v. %@, Retrying...", version); 
        }; 
       } 

      } 
     } 

     [defaults setObject:currentVersion forKey:VERSION_KEY]; 
     [defaults synchronize]; 
    } 

} 


- (NSString *)versionNumberString { 
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; 
    return majorVersion; 
} 
संबंधित मुद्दे