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

整体思路

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

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

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

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

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

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

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

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

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

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

用户切换账户的场景

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

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

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

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

改进

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

示意代码

-(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;
}

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

clientInfo = [YLSClientInfo new];

if([clientInfo needInit]){
    [self createEverythingForFirstTime];// 初始化时才运行
}
[self allTheTime];// 不论什么时候都运行

[migrationHelper doMigration:clientInfo];

增量迁移:

-(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;
    }

    // 其它的情况
}
时间: 2024-10-08 11:13:25

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

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

总体思路 一般app启动之后,都有一个初始化的过程.此外后续app升级,还需要考虑数据迁移.所以初始化和数据迁移的框架,在初期的版本就要考虑好 总结一下我们的app采取的方案: 1.在持久化的文件夹内(比如UserDefaults或者Documents目录),用一个字段保存老版本号 2.在开始初始化之前,读取老版本号,以及当前版本号 3.如果该应用是第一次加载,那么老版本号就取不到(因为是初次加载,这个字段还没有保存),那么就可以执行初始化过程:如果取到了老版本号,就不执行初始化 4.初始化完成

iOS App之间传递数据的几种方式

UIDocumentInteractionController UIActivityViewController Shared Keychain Access Custom URL Scheme Web Service iCloud API UIPasteboard 参考 http://enharmonichq.com/sharing-data-locally-between-ios-apps/ http://stackoverflow.com/questions/9425706/share-d

数据迁移工作总结

这两天,公司项目excel数据功能扩展,需要对历史数据进行数据迁移. 公司最近几次重大功能的上线,都设计到数据迁移问题.可以说数据迁移是产品上线之前,重要的一个环节.数据迁移一般设计的问题较多,不单单是数据位置的变动,更多的是数据格式要变化. 这两天我的任务就是根据原有的四个数据库表合成新的三张数据库表,同时将历史的excel数据格式进行转换,存储的MongoDB中.这数据迁移的过程中,还是有很多问题需要注意的. 首先,就是数据迁移时间问题.数据迁移尽量要在短时内搞定,因为只有在短时间内搞定,保

秒杀系统的思考方式与设计思路--左手隔离,右手分层

大家好,我是崔皓. 很高兴有这样一个机会和大家认识.我在IT行业从事软件开发工作十余年了,足迹涵盖企业服务,互联网,企业数字化转型等.工作之余热爱阅读和学习,希望能通过这个专栏和大家成为朋友. 开篇 本次专栏要给大家分享的是"如何设计秒杀系统",专栏共包括15章,本章是第一章.今天会给大家介绍以下内容: 秒杀场景的特征 隔离的设计思路 分层设计思路本章的讲解思路是,提出秒杀场景的特征,也就是理解什么是秒杀.然后介绍在秒杀系统设计的底线,有了底线才能保证进可攻退可守.最后介绍使用哪些方法

iOS Core Data 数据迁移 指南

前言 Core Data是iOS上一个效率比较高的数据库框架,(但是Core Data并不是一种数据库,它底层还是利用Sqlite3来存储数据的),它可以把数据当成对象来操作,而且开发者并不需要在乎数据在磁盘上面的存储方式.它会把位于NSManagedObject Context里面的托管对象NSManagedObject类的实例或者某个NSManagedObject子类的实例,通过NSManagedObjectModel托管对象模型,把托管对象保存到持久化存储协调器NSPersistentSt

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

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

转: ios app架构设计

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

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

权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个URL. 2,例如添加或修改功能,对应两个URL:..add, ..addUI 权限模型 权限方案: 用户 *----* 角色 *----* 权限 与权限相关的功能具体有哪些: 初始化数据:... 分配权限:... 使用权限:... 具体有哪些功能 初始化数据(安装) 权限数据. 超级管理员. 分配

Core Data 版本数据迁移

Core Data版本迁移基础 通常,在使用Core Data的iOS App上,不同版本上的数据模型变更引发的数据迁移都是由Core Data来负责完成的.这种数据迁移模式称为Lightweight Migration(可能对于开发人员来说是lightweight),开发人员只要在添加Persistent Store时设置好对应选项,其它的就交付给Core Data来做了:从命名上可以看出这两个选项分别代表:自动迁移Persistent Store,以及自动创建Mapping Model.自动