您的位置:首页 > 移动开发

iOS-App版本升级时数据库的迁移更新

2016-12-21 15:56 483 查看
在每一次运行程序的时候,判断是否存在数据库,如果不存在则直接创建数据库,若存在取出数据库版本号进行其他的处理.

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

那么问题来了,为什么我们需要将版本信息加一呢,这是为了以后进行版本判断的时候更加方便.
还有一个问题,为什么我们将版本信息放入数据库而不使用UserDefaults快速存储呢?原因是你需要考虑到
当你的app有不同的用户登录时,UserDefaults是所有数据共享的,你不能根据不同的用户来处理他的信息
判段他的信息是否需要更新


当用户更新app的时候,会直接从数据库中取出上一次保存的版本字段,例如是2.0版本的时候,会直接从case2开始执行,修改完数据结构以后,再一次将版本字段存到数据库中.
所以每更新一次版本,如果数据结构信息有变动的时候,直接在后面加case语句即可.
下面是一些参考代码,使用FMDB库:

/**
*  1.当没有数据库存在的时候,创建数据库 然后执行版本1的创建(创建版本表,创建信息表),保存1.0+1.0信息到版本库,数据库内版本号为2.0
2.当有数据库存在的时候,执行判断版本库的版本信息,版本号赋值给dbVersion,然后进行信息的更新,同时更新版本号的更新
*/
-(instancetype)init
{
//设置数据库版本为1
int dbVersion = 1;
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:
{
//说明用户第一次安装  1.0版本
//创建版本表
[self excuteLocalSql:createTB_info];
//创建信息表
[self excuteLocalSql:create_tusersql];
//保存1.0+1.0信息到数据库   用于下一次判断版本号
[self setDBInfoValueWithString:@"2.0"];
}
case 2:
{
//更新信息表
[self excuteLocalSql:update_tusersql];
//保存2.0+1.0到数据库
[self setDBInfoValueWithString:@"3.0"];
}
case 3:
[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(@"创建失败!");
}
}


文/_轻舟(简书作者)

原文链接:http://www.jianshu.com/p/5e1b1ac6d224

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: