整体思路

一般app启动之后,都有一个初始化的过程。

此外兴许app升级,还须要考虑数据迁移。所以初始化和数据迁移的框架。在初期的版本号就要考虑好

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

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

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

3、假设该应用是第一次载入,那么老版本就取不到(由于是初次载入,这个字段还没有保存),那么就能够运行初始化过程。假设取到了老版本。就不运行初始化

4、初始化完毕之后,运行数据迁移。

由于有老版本和新版本,所以能够通过对照,实现增量式的迁移

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

6、下次正常启动,就不会再初始化,也不会运行数据迁移了;假设是安装新版本号,因为当前版本号号刷新,又会触发数据迁移

用户切换账户的场景

上面说的是比較简单的场景。假设应用同意多用户切换账号,并且不同用户的数据是分离的,就更复杂一些

首先标识老版本的字段不能保存在UserDefaults里,由于UserDefaults是用户共享的。这样当A用户初始化之后,老版本就存在了。

切换到B用户,发现老版本已存在。则不会运行初始化,事实上这时候B用户的数据文件还没有创建好。所以须要把老版本存在单独的地方。比方每一个用户各自的sqlite文件里

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

改进

眼下临时是把老版本保存在sqlite里,可是这样首次读取的时候。推断逻辑比較麻烦。须要推断sqlite文件是否存在。然后要推断table有没有。最后才干取值。假设用文本保存可能会略微方便一点,比存在sqlite里,少了一个推断table是否存在的步骤

示意代码

  1. -(BOOL) needInit
  2. {
  3. return [oldVersion isEqual: @"0"];
  4. }
  5.  
  6. -(NSString*) oldVersion
  7. {
  8. return oldVersion;
  9. }
  10.  
  11. -(NSString*) currentVersion
  12. {
  13. return currentVersion;
  14. }
  15.  
  16. #pragma mark - private method
  17.  
  18. -(void) initOldVersion
  19. {
  20. // 数据库文件不存在。oldVersion设为0
  21. NSFileManager *fileManager = [NSFileManager defaultManager];
  22. NSString *dbFilePath = [YLSGlobalUtils getDatabaseFilePath];
  23. if(![fileManager fileExistsAtPath:dbFilePath]){
  24. oldVersion = @"0";
  25. return;
  26. }
  27.  
  28. // 数据库文件打开失败。oldVersion设为0
  29. FMDatabase *db = [FMDatabase databaseWithPath:dbFilePath];
  30. if(![db open]){
  31. oldVersion = @"0";
  32. return;
  33. }
  34.  
  35. // tb_clientstage表不存在,oldVersion设为0
  36. int tableCount = 0;
  37. FMResultSet *rs = [db executeQuery:@"select count(*) as count from sqlite_master where type='table' and name='tb_clientstage'"];
  38. if([rs next]){
  39. tableCount = [rs intForColumn:@"count"];
  40. }
  41. if(tableCount == 0){
  42. oldVersion = @"0";
  43. [db close];
  44. return;
  45. }
  46.  
  47. // 设置oldVersion
  48. rs = [db executeQuery:@"select * from tb_clientstage where id = '1' and tableno = '0'"];
  49. if([rs next]){
  50. oldVersion = [rs stringForColumn:@"version"];
  51. }else{
  52. oldVersion = @"0";
  53. }
  54. [db close];
  55. }
  56.  
  57. -(void) initCurrentVersion
  58. {
  59. NSDictionary* infoDict =[[NSBundle mainBundle] infoDictionary];
  60. NSString* versionNum =[infoDict objectForKey:@"CFBundleVersion"];
  61. currentVersion = versionNum;
  62. }

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

  1. clientInfo = [YLSClientInfo new];
  2.  
  3. if([clientInfo needInit]){
  4. [self createEverythingForFirstTime];// 初始化时才运行
  5. }
  6. [self allTheTime];// 不论什么时候都运行
  7.  
  8. [migrationHelper doMigration:clientInfo];

增量迁移:

  1. -(void) doMigration:(YLSClientInfo*)clientInfo
  2. {
  3. NSString *oldVersion = [clientInfo oldVersion];
  4. NSString *currentVersion = [clientInfo currentVersion];
  5.  
  6. // 正常登陆。不须要数据迁移
  7. if([oldVersion isEqualToString:currentVersion]){
  8. return;
  9. }
  10.  
  11. // 全新安装,非升级,不须要数据迁移
  12. if([oldVersion isEqualToString:@"0"]){
  13. return;
  14. }
  15.  
  16. // 下面均是版本号升级,须要数据迁移
  17. if([oldVersion isEqualToString:@"1.0.0"]){
  18. [script1 doMigration];
  19. [script2 doMigration];
  20. [script3 doMigration];
  21. [script4 doMigration];
  22. return;
  23. }
  24.  
  25. // 其它的情况
  26. }

ios app初始化和数据迁移的设计思路的更多相关文章

  1. iOS APP之本地数据存储(译)

    最近工作中完成了项目的用户信息本地存储,查阅了一些本地存储加密方法等相关资料.期间发现了一个来自印度理工学院(IIT)的信息安全工程师的个人博客,写了大量有关iOS Application secur ...

  2. sql数据表的设计思路

    好的表结构分的比较细致,个人理解大概主要分为主表.明细.历史记录表.中间表,辅助表结构应该分为:类型表.状态表.统计表.统计明细表等.为了一个功能加那么多表实在是多余,如果写一个非常复杂的业务逻辑还是 ...

  3. HBase 数据迁移

    最近两年负责 HBase,经常被问到一些问题, 本着吸引一些粉丝.普及一点HBase 知识.服务一点阅读人群的目的,就先从 HBase 日常使用写起,后续逐渐深入数据设计.集群规划.性能调优.内核源码 ...

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

    版权声明:本文为博主原创文章,未经博主允许不得转载. 如果IOS App 使用到CoreData,并且在上一个版本上有数据库更新(新增表.字段等操作),那在覆盖安装程序时就要进行CoreData数据库 ...

  5. 转: ios app架构设计

    http://keeganlee.me/post/architecture/20160107 看完这一系列文章后就知道怎么回答这类问题了: App架构设计经验谈:接口的设计 App架构设计经验谈:技术 ...

  6. 设计比较好,有助于学习的Github上的iOS App源码 (中文)

    Github版 中文 : TeamTalk 蘑菇街. 开源IM. 电商强烈推荐. MyOne-iOS 用OC写的<一个> iOS 客户端 zhihuDaily 高仿知乎日报 Coding ...

  7. .net core2.1 - ef core数据库迁移,初始化种子数据

    起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别.一切OK,见下面内容. 1.首 ...

  8. 权限模块_整体方案说明_设计实体&映射实体_实现初始化权限数据的功能

    权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个 ...

  9. EasySharding.EFCore 如何设计使用一套代码完成的EFCore Migration 构建Saas系统多租户不同业务需求且满足租户自定义分库分表、数据迁移能力?

    下面用一篇文章来完成这些事情 多租户系统的设计单纯的来说业务,一套Saas多租户的系统,面临很多业务复杂性,不同的租户存在不同的业务需求,大部分相同的表结构,那么如何使用EFCore来完成这样的设计呢 ...

随机推荐

  1. Vue框架学习笔记

    <div id="app"> </div> var app = new Vue({ el:"#app", // 绑定的元素 data:{ ...

  2. python-string中部分string替换

    今天遇到一个问题,就是需要把 “/home/zhangshuli/32_kk/” 中的32_kk 替换成为 52_kk 然后就在网上找方法,刚开始尝试的方法是 aaa = "/home/zh ...

  3. 90.#define高级用法

    define把参数变成字符串 #define f(x) printf("%s",#x); define连接两个字符串 #define a(x) a##x define把参数变成字符 ...

  4. USB串行端口

    USB-SERIAL CH341A(COM22)USB串行端口

  5. 00087_File

    1.IO概述 (1)要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘.光盘.U盘等)上: (2)当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...

  6. zeromq and jzmq

    install c test install jzmq java test Storm UI Cluster Summary Version Nimbus uptime Supervisors Use ...

  7. [D3] Build a Line Chart with D3 v4

    Line charts are often used to plot temporal data, like a stock price over time. In this lesson we’ll ...

  8. Codeforces #28 C.Bath Queue (概率dp)

    Codeforces Beta Round #28 (Codeforces format) 题目链接: http://codeforces.com/contest/28/problem/C 题意: 有 ...

  9. Dynamic device virtualization

    A system and method for providing dynamic device virtualization is herein disclosed. According to on ...

  10. __block typeof的说明

    1. block不是Object对象,所以对retain无效,要想保留block生命周期,最好通过copy来实现,当然copy后,要记得release. 2.一般被block的应用的对象,retain ...