当iPhone上的应用程序版本更改时,sqlite数据库更新
我有一个应用程序1.0版本的应用程序商店,它使用sqlite数据库读取数据。
现在我想更新我的版本到1.1更新数据库文件。
当我在设备上安装应用程序时使用开发人员证书时,它没有更新数据库,因为数据库文件已经存在于文档文件夹中,所以我必须手动删除应用程序并重新安装。
我的问题是,当任何用户更新应用程序,数据库也会根据当前版本更新。
任何build议,欢迎。
谢谢
我相信有很多方法可以做到这一点(还有很多方法可以改善我的方式),但我处理这些问题的方式如下:
首先我在应用程序的第一个.h文件中定义一个常量(将首先加载的),以指示首次加载并将其设置为0:
#define FirstTime 0
现在,您必须知道,我打算将此常量的值保存在“文档”文件夹中以备将来参考,因此我使用共享数据实例。 在viewDidLoad
我做了以下testing:
//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)。 我将FirstTime
更改为2:
#define FirstTime 2
由于光盘上保存的FirstTime值为1,这意味着您将被上面的if语句捕获,因此您可以在其中执行任何想要的操作,例如删除旧表并使用新的格式重新创build它们。
再次不是那么辉煌,而是解决了案子!
这种方法依赖于NSUserDefaults
。 这个想法是从NSUserDefaults
获取以前的应用程序版本号(如果存在),并将其与当前版本进行比较。
如果以前的应用程序版本<
当前版本,或者以前的版本nil
则代码执行数据库升级。 这意味着,即使应用程序已经发布在AppStore上,也可以使用这种方法。 它将在应用程序更新期间将数据库升级到新版本。
这是一个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; }
你也可以使用.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]; } }
你可以在应用程序启动时或在你的主视图控制器的视图控制器中调用该函数..你的select。
希望能帮助到你。