前言
升级数据库是个很繁琐看似很麻烦的事情,有次面试,面试官问了关于增加字段更新数据库升级的问题,我是这么回答的,我说可以做一个数据库迁移拷贝
,每次更新版本判断一下,面试官表示很不解,为什么要这么复杂化,重复问了好几次,也许在等我更好的答案;
需要在已经存在的表里面新增一个或者多个字段,思路应该是这样的;
先去判断增加的字段是否存在,不存在就去插入:
1
#import "FMDatabaseAdditions.h" // 导入头文件
// 判断
if (![db columnExists:@"需要增加的字段" inTableWithName:@"表名"]){
}
2
如果不存在,就执行插入操作:
NSString *alertStr = [NSString stringWithFormat:@"ALTER TABLE %@ ADD %@ INTEGER",@"表名",@"新增字段"];
BOOL worked = [db executeUpdate:alertStr];
if(worked){
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
3
升级顺序如下:
// 获得Documents目录路径
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 文件路径
NSString *sqlitePath = [NSString stringWithFormat:@"MLChatDataBase%@.sqlite", [MLSettingTool objectForKey:ML_UserId]];
NSString *filePath = [documentsPath stringByAppendingPathComponent:sqlitePath];
// 实例化FMDataBase对象
_db = [FMDatabase databaseWithPath:filePath];
[_db open];
// 初始化数据表
NSString *userInfoSql = @"CREATE TABLE IF NOT EXISTS UserInfoData (userId VARCHAR(255) PRIMARY KEY NOT NULL, realName VARCHAR(255),headImg VARCHAR(255),mobile VARCHAR(255))";
[_db executeUpdate:userInfoSql];
// 判断是否包含表字段
if (![db columnExists:@"age" inTableWithName:@"UserInfoData"]){
NSString *alertStr = [NSString stringWithFormat:@"ALTER TABLE %@ ADD %@ INTEGER",@"UserInfoData",@"age"];
BOOL worked = [db executeUpdate:alertStr];
if(worked){
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
}
[_db close];
网友评论