本文共 1718 字,大约阅读时间需要 5 分钟。
转载自: https://www.jianshu.com/p/124a2e4e8c42
升级数据库是个很繁琐看似很麻烦的事情,有次面试,面试官问了关于增加字段更新数据库升级的问题,我是这么回答的,我说可以做一个数据库迁移拷贝
,每次更新版本判断一下,面试官表示很不解,为什么要这么复杂化,重复问了好几次,也许在等我更好的答案;需要在已经存在的表里面新增一个或者多个字段,思路应该是这样的;
先去判断增加的字段是否存在,不存在就去插入:#import "FMDatabaseAdditions.h" // 导入头文件// 判断if (![db columnExists:@"需要增加的字段" inTableWithName:@"表名"]){ }
如果不存在,就执行插入操作:
NSString *alertStr = [NSString stringWithFormat:@"ALTER TABLE %@ ADD %@ INTEGER",@"表名",@"新增字段"]; BOOL worked = [db executeUpdate:alertStr]; if(worked){ NSLog(@"插入成功");}else{ NSLog(@"插入失败");}
升级顺序如下:
// 获得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];