在實際開發,在第一個版本釋出之後,就建立了資料庫,如果在第二個版本當中,字段有所改變的話,不更新更新資料庫,就會造成錯誤,資料存儲無法完成,可能造成閃退。
由于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,歡迎大家進入