在实际开发,在第一个版本发布之后,就创建了数据库,如果在第二个版本当中,字段有所改变的话,不升级升级数据库,就会造成错误,数据存储无法完成,可能造成闪退。
由于SQLite,只能在原来的表中增加字段,不能删掉字段、修改字段类型、修改字段名,所以写了这篇文章,希望能帮到大家,废话不多说,代码走起
比如:
第一版本的字段和类型为:a TEXT, b INTEGER, c TEXT
首先要保存这段 字段和类型的字符串
第二版本的字段和类型为:a2 TEXT, b2 TEXT, c TEXT
/**
* 升级数据库
*
* @param tableName 表名
* @param old 旧的字段名和类型 字符串 “a TEXT, b INTEGER, c TEXT”
* @param newStr 新的字段名和类型 字符串 “a2 TEXT, b2 TEXT, c TEXT”
* @param db
*/
-(void)upgradeDB:(NSString *)tableName oldStr:(NSString *)oldStr newStr:(NSString *)newStr db:(FMDatabase *)db{
NSString *rename =[NSString stringWithFormat:@"ALTER TABLE %@ RENAME TO %@Old",tableName,tableName];
[db executeUpdate:rename]; //重命名表名
NSString *create = [NSString stringWithFormat:@"create table if not exists %@(%@)",tableName,newStr];
[db executeUpdate:create];//创建新的表
NSArray *oldArr = [oldStr componentsSeparatedByString:@","];
NSArray *newArr = [newStr componentsSeparatedByString:@","];
NSString *columns = [NSString new];
//oldStr和newStr交集 @["c TEXT"]
NSMutableArray *marr = [NSMutableArray array];
for (int i=0;i<oldArr.count;i++){
for (int j=0; j<newArr.count;j++){
if ([oldArr[i] isEqualToString:newArr[j]]) {
if (![marr containsObject:oldArr[i]]) {
[marr addObject:oldArr[i]];
}
}
}
}
//获取所有字段名 c
for (NSString *str in marr) {
NSRange range = [str rangeOfString:@" "];
NSString *str2 = [str substringToIndex:range.location];
columns= [columns stringByAppendingFormat:@"%@,",str2];
}
if (columns.length > 0) {
columns=[columns substringToIndex:columns.length-1];
}
NSString *oldToNew = [NSString stringWithFormat:@"INSERT INTO %@(%@) SELECT %@ FROM %@Old",tableName,columns,columns,tableName];
[db executeUpdate:oldToNew];//从旧表的数据 插入到 新表中
NSString *deleteOld =[NSString stringWithFormat:@"DROP TABLE %@Old",tableName];
[db executeUpdate:deleteOld];//删除旧表
}
更多的数据库操作,在FMDB的基础再一次封装,访问点击打开链接
我的业余技术微信公众号:YKJGZH,欢迎大家进入