应用程序版本在iPhone应用程序商店中更改时,SQLITE数据库如何更新?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (97)

我有一个应用程序与版本1.0在应用商店,其中使用SQLITE数据库读取数据。现在,我想用更新数据库文件将我的版本更新为1.1。

当我在设备上安装应用程序时,使用开发人员证书时,它没有更新数据库,因为数据库文件已经存在于Documents文件夹中,所以我不得不手动删除应用程序并重新安装它。

我的问题是,当用户更新应用程序时,数据库是否也会按照当前版本更新。

提问于
用户回答回答于

我相信有很多方法可以做到这一点(而且有很多方法比我的方法更好),但我处理这些问题的方法如下:

首先,我在应用程序的第一个.h文件中定义了一个常量(将首先加载的文件)来指示第一次加载,并将其设置为0:

#define FirstTime 0

现在您必须知道,我打算将这个常量的值保存在Documents文件夹中,以便将来引用,因此我使用了一个共享数据实例。在viewDidLoad我做以下测试:

//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
}

FirstTime改为2:

#define FirstTime 2

由于磁盘上保存的第一次值为1,这意味着您将被上面的if语句捕获,因此在其中您可以做任何您想做的事情,比如删除旧表,然后用新的格式重新创建它们。

用户回答回答于

这是一个plist文件:

有一个数组,它由版本号和相应升级版本的一组SQL查询组成。假设以前的版本为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;
}

扫码关注云+社区

领取腾讯云代金券