ios 关于SQLite数据库升级

在实际开发,在第一个版本发布之后,就创建了数据库,如果在第二个版本当中,字段有所改变的话,不升级升级数据库,就会造成错误,数据存储无法完成,可能造成闪退。

由于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,欢迎大家进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值