天天看點

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,歡迎大家進入