iOS App初始化或者升级,涉及本地数据库迁移的问题

总体思路

一般app启动之后,都有一个初始化的过程。此外后续app升级,还需要考虑数据迁移。所以初始化和数据迁移的框架,在初期的版本就要考虑好

总结一下我们的app采取的方案:

1、在持久化的文件夹内(比如UserDefaults或者Documents目录),用一个字段保存老版本号

2、在开始初始化之前,读取老版本号,以及当前版本号

3、如果该应用是第一次加载,那么老版本号就取不到(因为是初次加载,这个字段还没有保存),那么就可以执行初始化过程;如果取到了老版本号,就不执行初始化

4、初始化完成之后,执行数据迁移。因为有老版本号和新版本号,所以可以通过对比,实现增量式的迁移

5、上述动作都完成之后,刷新老版本号

6、下次正常启动,就不会再初始化,也不会执行数据迁移了;如果是安装新版本,由于当前版本号刷新,又会触发数据迁移

用户切换账户的场景

上面说的是比较简单的场景。如果应用允许多用户切换账号,而且不同用户的数据是分离的,就更复杂一些

首先标识老版本号的字段不能保存在UserDefaults里,因为UserDefaults是用户共享的。这样当A用户初始化之后,老版本号就存在了。切换到B用户,发现老版本号已存在,则不会执行初始化,其实这时候B用户的数据文件还没有创建好。所以需要把老版本号存在单独的地方,比如每个用户各自的sqlite文件中

然后,读取老版本号的时候,也要根据用户的独立标识去查询

改进

目前暂时是把老版本号保存在sqlite里,但是这样首次读取的时候,判断逻辑比较麻烦。需要判断sqlite文件是否存在,然后要判断table有没有,最后才能取值。如果用文本保存可能会稍微方便一点,比存在sqlite里,少了一个判断table是否存在的步骤

示意代码

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

-(BOOL) needInit

{

    return [oldVersion isEqual: @"0"];

}

-(NSString*) oldVersion

{

    return oldVersion;

}

-(NSString*) currentVersion

{

    return currentVersion;

}

#pragma mark - private method

-(void) initOldVersion

{

    // 数据库文件不存在,oldVersion设为0

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *dbFilePath = [YLSGlobalUtils getDatabaseFilePath];

    if(![fileManager fileExistsAtPath:dbFilePath]){

        oldVersion = @"0";

        return;

    }

    

    // 数据库文件打开失败,oldVersion设为0

    FMDatabase *db = [FMDatabase databaseWithPath:dbFilePath];

    if(![db open]){

        oldVersion = @"0";

        return;

    }

    

    // tb_clientstage表不存在,oldVersion设为0

    int tableCount = 0;

    FMResultSet *rs = [db executeQuery:@"select count(*) as count from sqlite_master where type=‘table‘ and name=‘tb_clientstage‘"];

    if([rs next]){

        tableCount = [rs intForColumn:@"count"];

    }

    if(tableCount == 0){

        oldVersion = @"0";

        [db close];

        return;

    }

    

    // 设置oldVersion

    rs = [db executeQuery:@"select * from tb_clientstage where id = ‘1‘ and tableno = ‘0‘"];

    if([rs next]){

        oldVersion = [rs stringForColumn:@"version"];

    }else{

        oldVersion = @"0";

    }

    [db close];

}

-(void) initCurrentVersion

{

    NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];

    NSString* versionNum =[infoDict objectForKey:@"CFBundleVersion"];

    currentVersion = versionNum;

}

然后,是否进行初始化的判断:

?


1

2

3

4

5

6

7

8

clientInfo = [YLSClientInfo new];

if([clientInfo needInit]){

    [self createEverythingForFirstTime];// 初始化时才执行

}

[self allTheTime];// 任何时候都执行

[migrationHelper doMigration:clientInfo];

增量迁移:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

-(void) doMigration:(YLSClientInfo*)clientInfo

{

    NSString *oldVersion = [clientInfo oldVersion];

    NSString *currentVersion = [clientInfo currentVersion];

    

    // 正常登陆,不需要数据迁移

    if([oldVersion isEqualToString:currentVersion]){

        return;

    }

    

    // 全新安装,非升级,不需要数据迁移

    if([oldVersion isEqualToString:@"0"]){

        return;

    }

    

    // 以下均是版本升级,需要数据迁移

    if([oldVersion isEqualToString:@"1.0.0"]){

        [script1 doMigration];

        [script2 doMigration];

        [script3 doMigration];

        [script4 doMigration];

        return;

    }

    

    // 其他的情况

}

 

iOS App初始化或者升级,涉及本地数据库迁移的问题

时间: 2024-11-08 14:25:26

iOS App初始化或者升级,涉及本地数据库迁移的问题的相关文章

如何将本地数据库迁移至SQL Azure

Windows Azure的SQL Azure和SQL Server 拥有不同的体系结构,可以说是两个不同的产品.SQL Azure不完全支持或者尚不支持SQL Server的某些功能,这使得我们不能像平常一样使用bak文件还原的方式迁移数据库,也不能使用数据导入导出向导.很多SQL Server的特性在SQL Azure中不被支持. 那我们怎样才能将现有数据库迁移到SQL Azure上呢? 一."将数据库部署到SQL Azure"向导 我最先想到的是这个向导,对数据库右键=>任

使用SSMS 2014将本地数据库迁移到Azure SQL Database

使用SQL Server Management Studio 2014将本地数据库迁移到Azure SQL Database的过程比较简单,在SSMS2014中,有一个任务选项为“将数据库部署到Windows Azure SQL Database”: 使用本选项可实现一键迁移到Azure SQL Database. 但是, 最近由于近期Azure的改动,导致Azure支持的数据库类型与SSMS2014中数据库的类型不匹配,整个迁移过程会死在在Azue中创建数据库的步骤上.在国际版Azure, 已

ios app初始化和数据迁移的设计思路

整体思路 一般app启动之后,都有一个初始化的过程. 此外兴许app升级,还须要考虑数据迁移.所以初始化和数据迁移的框架.在初期的版本号就要考虑好 总结一下我们的app採取的方案: 1.在持久化的文件夹内(比方UserDefaults或者Documents文件夹),用一个字段保存老版本 2.在開始初始化之前,读取老版本.以及当前版本 3.假设该应用是第一次载入,那么老版本就取不到(由于是初次载入,这个字段还没有保存),那么就能够运行初始化过程.假设取到了老版本.就不运行初始化 4.初始化完毕之后

django数据库迁移sqlmigrate调试

django>=1.7数据库迁移只有三个命令 migrate,用来迁移数据库. 用法:migrate app makemigrations,用来检测数据库变更和生成数据库迁移文件. 用法:makemigratioins app sqlmigrate,用来把数据库迁移文件转换成数据库语言(displays the SQL statements for a migratioin.) 用法:sqlmigrate app migration,比如makemigrations生成了0001_initial

CoreData(数据库升级 )版本迁移-iOS App升级安装

版权声明:本文为博主原创文章,未经博主允许不得转载. 如果IOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表.字段等操作),那在覆盖安装程序时就要进行CoreData数据库的迁移,具体操作如下: 1.选中你的mydata.xcdatamodeld文件,选择菜单editor->Add Model Version  比如取名:mydata2.xcdatamodel 2.设置当前版本 选择上级mydata.xcdatamodeld ,在inspector中的Versione

IOS APP 升级流程

1.Itunes connect 2.登录 3.Manage your apps 4.点击要升级的图标 5.Add version(右侧) 6.填写版本号和描述.(在商店里给用户看) 7.Ready to  upload bineary 8.选择no选项,一直下一步 9.Automaitically release~~~~----->save 10.打开程序,选择info.list.更改版本号 Bundleversions string short 和 Bundle version 都改成要升级

25条提高iOS App性能的建议和技巧

这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址      当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢就会让你得到不好的评论. 然而,由于IOS设备的限制有时很难工作得很正确.我们开发时有很多需要我们记住这些容易忘记的决定

20个可以帮你简化iOS app开发流程的工具

这里推荐20个可以帮你简化iOS app开发流程的工具.很多开发者都使用过这些工具,涉及原型和设计.编程.测试以及最后的营销,基本上涵盖了整个开发过程. 原型和设计 有了一个很好的创意后,你要做的不是立刻编程,而是设计UI和创建原型,这样你才能知道app如何运行,根据用户体验需要做哪些调整. App Cooker AppCooker 不仅是一个创建原型的优秀工具,它提供的许多功能还可以帮助你将程序发布到App store中.它集成了Dropbox,Box.net和photo roll,你可以直接

25条提高iOS App性能的技巧和诀窍

 这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or follow him on Twitter.原文地址      当我们开发iOS应用时,好的性能对我们的App来说是很重要的.你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核. 然而,由于IOS设备的限制有时很难工作得很正确.我们开发时有很多需要我们记住这些容易忘记的决定对