zoukankan      html  css  js  c++  java
  • 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的更新
    }
  • 相关阅读:
    iOS
    “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported value for targets which use Swift
    iOS
    iOS
    springboot rabbitmq 死信队列应用场景和完整demo
    LRU
    分布式系统高可用原则
    Java8 Stream 流使用场景和常用操作
    下载安装Zookeeper
    Java8内置的函数式编程接口应用场景和方式
  • 原文地址:https://www.cnblogs.com/zkzzkz/p/5711331.html
Copyright © 2011-2022 走看看