ios实战-数据库更新升级方案

我们常使用fmdb或者其他方式创建sqlite数据库,但是由于版本迭代问题,常常有需求要更新数据库,比如加字段、删除、修改字段等等,怎么样才能升级数据库且保持原来存的数据有效呢,上代码:

const static NSInteger FAMILY_LIST_DB_MANAGER_VER = 1;

@implementation KSFamilyListDBManager
{
    DBManager *_dbMgr;
}

+ (instancetype)sharedManager
{
    static KSFamilyListDBManager *s_instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        s_instance = [[KSFamilyListDBManager alloc] init];
    });
    return s_instance;
}

- (id)init {
    self = [super init];
    if (self) {
        _dbMgr = [DBManager defaultMgr];
        
        [self createTables];
        
        // 升级操作
        NSInteger ver = [[ConfigDBManager sharedManager] familyListDBManagerVersion];
        if (ver < 1) {
            [[ConfigDBManager sharedManager] setFamilyListDBManagerVersion:FAMILY_LIST_DB_MANAGER_VER];
        } else if (ver < FAMILY_LIST_DB_MANAGER_VER) {
            [self upgrade];
        }
    }
    return self;
}

- (void)upgrade {
    //获取存储好的原版本号
    NSInteger oldVersionNum = [[ConfigDBManager sharedManager] familyListDBManagerVersion];
    if (FAMILY_LIST_DB_MANAGER_VER <= oldVersionNum || oldVersionNum == 0) {
        return;
    }
    
    //升级
    [self upgrade:oldVersionNum];
    
    // 保存新的版本号到库中 -这里大家可以使用NSUserDefault存储
    [[ConfigDBManager sharedManager] setFamilyListDBManagerVersion:FAMILY_LIST_DB_MANAGER_VER];
}

- (void)upgrade:(NSInteger)oldVersion {
    if (oldVersion >= FAMILY_LIST_DB_MANAGER_VER) {
        return;
    }
    switch (oldVersion) {
        case 0:
            break;
        case 1:
            [self upgradeFrom1To2];
            break;
        case 2:
            break;
        default:
            break;
    }
    oldVersion ++;
    
    // 递归判断是否需要升级
    [self upgrade:oldVersion];
}

- (void)upgradeFrom1To2 {
    //这里执行Sql语句 执行版本1到版本2的更新
}
原文地址:https://www.cnblogs.com/zkzzkz/p/5711331.html