前一段时间在进行App升级的时候,由于一开始版本初期没有考虑完善,导致走了很多弯路,后来经过自己的一些思考,总结出了一些在app升级的时候,数据库内文件同步保持更新的经验,希望能给大家带来帮助.

总体方案及思路

流程图
  1. 在每一次运行程序的时候,判断是否存在数据库,如果不存在则直接创建数据库,若存在取出数据库版本号进行其他的处理.

  2. ,当用户第一次下载安装app的时候,第一次建立版本库,将我们的数据信息存入数据库中,同时保存一个当前版本号加一的字段到数据库中.

     那么问题来了,为什么我们需要将版本信息加一呢,这是为了以后进行版本判断的时候更加方便.
    还有一个问题,为什么我们将版本信息放入数据库而不使用UserDefaults快速存储呢?原因是你需要考虑到
    当你的app有不同的用户登录时,UserDefaults是所有数据共享的,你不能根据不同的用户来处理他的信息
    判段他的信息是否需要更新
  3. 当用户更新app的时候,会直接从数据库中取出上一次保存的版本字段,例如是2.0版本的时候,会直接从case2开始执行,修改完数据结构以后,再一次将版本字段存到数据库中.
  4. 所以每更新一次版本,如果数据结构信息有变动的时候,直接在后面加case语句即可.

下面是一些参考代码,使用FMDB库:

/**
* 1.当没有数据库存在的时候,创建数据库 然后执行版本1的创建(创建版本表,创建信息表),保存1.0+1.0信息到版本库,数据库内版本号为2.0
2.当有数据库存在的时候,执行判断版本库的版本信息,版本号赋值给dbVersion,然后进行信息的更新,同时更新版本号的更新
*/
-(instancetype)init
{
//设置数据库版本为1
int dbVersion = ;
if (self = [super init]) {
//判断本地有没有数据库文件
if (![self isExistDB]) {
//不存在 初始化数据库
[self createDB];
}else
{
//如果存在,那么获取版本信息
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
NSString * currentVersion = [self getDBInfoValue];
dbVersion = currentVersion.intValue;
} switch (dbVersion) { //判断版本信息
case :
{
//说明用户第一次安装 1.0版本
//创建版本表
[self excuteLocalSql:createTB_info];
//创建信息表
[self excuteLocalSql:create_tusersql];
//保存1.0+1.0信息到数据库 用于下一次判断版本号
[self setDBInfoValueWithString:@"2.0"];
}
case :
{
//更新信息表
[self excuteLocalSql:update_tusersql];
//保存2.0+1.0到数据库
[self setDBInfoValueWithString:@"3.0"];
}
case :
[self excuteLocalSql:modify];
[self setDBInfoValueWithString:@"4.0"];
default:
break;
} }
return self;
}

使用的方法:

//使用的SQL语句
static NSString *createTB_info=@"create table if not exists t_info (version text)";
static NSString *create_tusersql = @"CREATE TABLE IF NOT EXISTS T_User (userid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username TEXT, usergender TEXT, usercreatetime date, userupdatetime date,age INTEGER,islogined INTEGER)";
static NSString * update_tusersql = @"alter table T_User add column useraddress TEXT";
static NSString *modify=@"alter table T_User add column password text not null default '111111'"; //判断是否存在数据库
-(BOOL)isExistDB
{
NSFileManager *fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:[self getDBPath]];
} //得到路径
-(NSString *)getDBPath
{
return [NSString stringWithFormat:@"%@/Documents/user1.sqlite",NSHomeDirectory()];
} #pragma mark - 更新版本号
-(BOOL)updateVersionInfoWithString:(NSString *)version
{
NSString *sql = @"UPDATE t_info SET version = ?";
BOOL b = [_dataBase executeUpdate:sql,version];
return b;
} #pragma mark - 插入版本号
-(BOOL)insertVersionInfoWithString:(NSString *)version
{
NSString *sql = @"INSERT INTO t_info(version) VALUES(?)";
BOOL b = [_dataBase executeUpdate:sql,version];
return b;
} #pragma mark - 创建版本信息
- (BOOL)setDBInfoValueWithString:(NSString *)string
{
if ([self getDBInfoValue]) {
//更新版本
[self updateVersionInfoWithString:string];
}
else
{
//插入版本
[self insertVersionInfoWithString:string];
}
return YES;
} //得到版本信息
- (NSString *)getDBInfoValue
{
NSString *sql = @"select version from t_info";
//注意 需要先打开数据库
[_dataBase open];
FMResultSet *resultSet = [_dataBase executeQuery:sql]; NSString * version = nil;
while ([resultSet next]) {
version = [resultSet stringForColumn:@"version"];
}
return version;
} #pragma mark - 创建数据库中的表
- (BOOL)excuteLocalSql:(NSString *)createTB_info
{
BOOL b = [_dataBase executeUpdate:createTB_info];
NSLog(@"表的创建结果:%d",b);
return b;
} #pragma mark - 初始化数据库
- (void)createDB
{
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
if (_dataBase.open == YES) {
NSLog(@"数据库成功创建!");
}else
{
NSLog(@"创建失败!");
}
}

App升级时数据库的迁移更新的更多相关文章

  1. 基于现有数据库的Code First模式迁移更新数据库

    本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...

  2. C# 使用Code First迁移更新数据库

    三步完成迁移: 1. 启用迁移: Enable-Migrations Enable-Migrations -ContextTypeName Mvc4WebSite.Models.MvcGuestboo ...

  3. ios开发 数据库版本迁移手动更新迭代和自动更新迭代

    数据库版本迁移顾名思义就是在原有的数据库中更新数据库,数据库中的数据保持不变对表的增.删.该.查. 数据持久化存储: plist文件(属性列表) preference(偏好设置) NSKeyedArc ...

  4. 支持“***Context”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

    在用VS进行MVC开发的过程中遇到如下问题: 支持“***Context”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft ...

  5. "ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库。

    一,在我使用自动生成数据库的时候,当你改变了数据库就会出现下面问题 "ApplicationDbContext"(泛指之类的数据库上下文模型)上下文的模型已在数据库创建后发生更改. ...

  6. ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(二)

    由于大家都热衷于对ios开发数据库版本迁移手动更新迭代和自动更新迭代艺术(一)的浏览下面我分享下我的源文件git仓库: 用法(这边我是对缓存的一些操作不需要可以省去):https://github.c ...

  7. System.InvalidOperationException: 支持“XXX”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。

    System.InvalidOperationException: 支持“XXX”上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.micro ...

  8. 支持“xxxContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    将项目的数据库连接用户及密码修改后(切换用户,用户名与原来不一样,用户下对象结构一致),报以下错误: 支持“XXXDBContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fir ...

  9. 错误:支持“EFDbContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/?LinkId

    支持"EFDbContext"上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库(http://go.microsoft.com/fwlink/ ...

随机推荐

  1. matlab中 hold on 与hold off的用法

    matlab中 hold on 与hold off的用法 hold on 是当前轴及图形保持而不被刷新,准备接受此后将绘制 hold off 使当前轴及图形不在具备被刷新的性质 hold on 和ho ...

  2. 实现一个JavaScript模块化加载器

    对任何程序,都存在一个规模的问题,起初我们使用函数来组织不同的模块,但是随着应用规模的不断变大,简单的重构函数并不能顺利的解决问题.尤其对JavaScript程序而言,模块化有助于解决我们在前端开发中 ...

  3. VS2010皮肤控件介绍

    在我们平时使用的各种工具中,如QQ,迅雷,以及各种空间等,都提供了一些换肤功能,可以让我们选择各种我们喜欢的界面.本文就对VS中常用的窗口程序做一个简单的换肤,利用一个dll文件来进行实现. 首先我们 ...

  4. 转:Java学习路线图

    作者: nuanyangyang 标  题: Java学习路线图(整理中,欢迎纠正) 发信站: 北邮人论坛 (Mon Aug 11 19:28:16 2014), 站内   [以下肯定是不完整的列表, ...

  5. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  6. block的是发送信号的线程,又不是处理槽函数的线程

    请问UI线程给子线程发信号,应该用哪种连接方式? 如果子线程正在执行一个函数,我发射信号去执行子线程的另一个函数,那么此时子线程到底会执行什么呢? 用信号量做的同步.第一把信号槽的事件丢到线程的事件队 ...

  7. svn文件提交时强制写注释

    这个操作需要修改版本库中的一个钩子文件,在你创建的版本库中有一个hooks文件夹,初始的时候其中有一个文件叫pre-commit.tmpl 在windows下将其修改为pre-commit.bat,在 ...

  8. 系统交易策略 hylt

    最令我尴尬的事情,莫过于很多朋友来到网站,不知道我说的是什么.大多数人以为鬼仆是推销软件的.其实这里理解是错的,特别是一些软件制作与经销商,更出 于推销的目的,故意夸大产品性能,模糊交易系统与一般行情 ...

  9. HDU 1280 前m大的数

    http://acm.hdu.edu.cn/showproblem.php?pid=1280 前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory L ...

  10. HDU-1716 排列2 (DFS)

    排列2 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...