HOME> 历届世界杯决赛> iOS-App版本升级时数据库的迁移更新

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

2025-06-28 05:14:39

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

,当用户第一次下载安装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

著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

阴阳师式神委派玩法详解 式神委派完美达成攻略
js 如何循环json数据