美文网首页iOS开发
iOS 数据库版本升级(FMDB)

iOS 数据库版本升级(FMDB)

作者: yuezishenyou | 来源:发表于2018-03-13 17:11 被阅读0次

    student 表(name,age)
    思想:
    1.把student表重命名old_student表
    2.创建新的表student(name,age,sex)
    3.把旧表里的数据拷贝到新表里去
    4.删除老的表

    DBManager.h

    #import <Foundation/Foundation.h>
    
    @interface DBManager : NSObject
    
    + (instancetype)shareManager;
    
    
    - (void)createDBWithName:(NSString *)dbName;
    
    - (void)createTableWithName:(NSString *)tableName;
    
    @end
    
    

    DBManager.m

    
    #import "DBManager.h"
    #import <FMDB/FMDB.h>
    
    
    
    //1.判断数据库版本号和保存数据库版本号
    NSString * const kdbManagerVersion = @"DBManagerVersion";
    const static NSInteger DB_MANAGER_VER = 2;
    
    
    
    #ifdef DEBUG
    #define debugLog(...)    NSLog(__VA_ARGS__)
    #define debugMethod()    NSLog(@"%s", __func__)
    #define debugError()     NSLog(@"Error at %s Line:%d", __func__, __LINE__)
    #else
    #define debugLog(...)
    #define debugMethod()
    #define debugError()
    #endif
    
    
    #define PATH_OF_DOCUMENT    [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
    
    
    static NSString * const DEFAULT_DB_NAME = @"app.db";
    
    static NSString *const CREATE_TABLE_SQL =
    @"CREATE TABLE IF NOT EXISTS %@ ( \
    id TEXT NOT NULL, \
    json TEXT NOT NULL, \
    createdTime TEXT NOT NULL, \
    PRIMARY KEY(id)) \
    ";
    
    static NSString *const UPDATE_ITEM_SQL = @"REPLACE INTO %@ (id, json, createdTime) values (?, ?, ?)";
    
    static NSString *const QUERY_ITEM_SQL = @"SELECT json, createdTime from %@ where id = ? Limit 1";
    
    static NSString *const SELECT_ALL_SQL = @"SELECT * from %@";
    
    static NSString *const COUNT_ALL_SQL = @"SELECT count(*) as num from %@";
    
    static NSString *const CLEAR_ALL_SQL = @"DELETE from %@";
    
    static NSString *const DELETE_ITEM_SQL = @"DELETE from %@ where id = ?";
    
    static NSString *const DELETE_ITEMS_SQL = @"DELETE from %@ where id in ( %@ )";
    
    static NSString *const DELETE_ITEMS_WITH_PREFIX_SQL = @"DELETE from %@ where id like ? ";
    
    static NSString *const DROP_TABLE_SQL = @" DROP TABLE '%@' ";
    
    
    
    
    
    @interface DBManager ()
    
    @property (nonatomic, strong) FMDatabaseQueue *dbQueue;
    
    @property (nonatomic, strong) FMDatabase *db;
    
    @end
    
    @implementation DBManager
    
    static DBManager *_manager = nil;
    
    + (instancetype)shareManager{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (_manager == nil) {
                _manager = [[DBManager alloc]init];
            }
        });
        return _manager;
    }
    
    - (instancetype)init
    {
        if (self = [super init]) {
       
            
        }
        return self;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    - (void)createDBWithName:(NSString *)dbName
    {
        NSString *path = [PATH_OF_DOCUMENT stringByAppendingPathComponent:dbName];
        NSLog(@"---path:%@----",path);
        
        if (_dbQueue) {
            [self close];
        }
        _dbQueue = [FMDatabaseQueue databaseQueueWithPath:path];
    }
    
    
    - (void)createTableWithName:(NSString *)tableName
    {
        NSInteger oldVersion = [[NSUserDefaults standardUserDefaults] integerForKey:kdbManagerVersion];
        
        NSLog(@"----oldVersion:%ld--------",oldVersion);
        
        if (oldVersion >= DB_MANAGER_VER)
        {
            [self createNewTableWithName:tableName];
        }
        else
        {
            NSLog(@"-升级数据库---");
            [self upgrade];
        }
    }
    
    - (void)createNewTableWithName:(NSString *)tbName
    {
        NSString *sql = [NSString stringWithFormat:CREATE_TABLE_SQL ,tbName];
        
        __block BOOL result;
        [_dbQueue inDatabase:^(FMDatabase * _Nonnull db) {
            result = [db executeUpdate:sql];
        }];
        if (result) {
            NSLog(@"--表格创建成功--");
            //[self saveDBVersion];
        }
        else
        {
            NSLog(@"--表格创建失败--");
        }
    }
    
    
    
    
    //----------------------------------------------------------------
    //MARK
    //----------------------------------------------------------------
    
    - (void)saveDBVersion
    {
        NSLog(@"----保存最终版本-----");
        [[NSUserDefaults standardUserDefaults] setInteger:DB_MANAGER_VER forKey:kdbManagerVersion];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }
    
    
    
    //2.数据库升级
    - (void)upgrade
    {
        // 获取旧版本号
        NSInteger oldVersionNum = [[NSUserDefaults standardUserDefaults] integerForKey:kdbManagerVersion];
        if (oldVersionNum >= DB_MANAGER_VER){
            return;
        }
        
        // 升级
        [self upgrade:oldVersionNum];
        
        // 保存新版本号
        [self saveDBVersion];
        
    }
    
    - (void)upgrade:(NSInteger)oldVersion
    {
        if (oldVersion >= DB_MANAGER_VER)
        {
            return;
        }
        
        switch (oldVersion) {
            case 0:
                [self upgradeFromOldToOne];
                break;
            case 1:
                
                [self upgradeFromOldToTwo];
                break;
                
            case 2:
                NSLog(@"----2变3- 未做--");
                break;
                
            default:
                break;
        }
        
        oldVersion++;
        
        // 判断是否需要升级
        [self upgrade:oldVersion];
        
    }
    
    
    - (void)upgradeFromOldToOne
    {
        NSLog(@"---0到1----");
        
        NSString *tbName = @"location";
       
        // 执行版本0到版本1的更新
        
        [_dbQueue inDatabase:^(FMDatabase * _Nonnull db) {
         
            [db open];
            
            NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ RENAME TO %@", tbName,
                             [tbName stringByAppendingString:@"_Old"]];
            
            [db executeUpdate:sql];
            
            
            //创建新的表
            NSString *executeStr = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ ( \
                                    id TEXT NOT NULL, \
                                    json TEXT NOT NULL, \
                                    createdTime TEXT NOT NULL, \
                                    name TEXT, \
                                    PRIMARY KEY(id)) \
                                    ",tbName];
            
            
            BOOL bRet = [db executeUpdate:executeStr];
            
            if (bRet)
            {
                // 从旧数据表把旧数据插入新的数据表中
                
                NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@ SELECT * ,'' FROM %@", tbName, [tbName stringByAppendingString:@"_Old"]];
                
                [db executeUpdate:insertSql];
            }
            
            // 删除旧的数据表
            [db executeUpdate:[NSString stringWithFormat:@"DROP TABLE %@", [tbName stringByAppendingString:@"_Old"]]];
            
            [db close];
    
            
        }];
        
    }
    
    - (void)upgradeFromOldToTwo
    {
        NSLog(@"---老版本到2----");
        
        
        NSString *tbName = @"location";
        
        [_dbQueue inDatabase:^(FMDatabase * _Nonnull db) {
            
            [db open];
            
            NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ RENAME TO %@", tbName,
                             [tbName stringByAppendingString:@"_Old"]];
            
            [db executeUpdate:sql];
            
            
            //创建新的表
            NSString *executeStr = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ ( \
                                    id TEXT NOT NULL, \
                                    json TEXT NOT NULL, \
                                    createdTime TEXT NOT NULL, \
                                    name TEXT, \
                                    age  TEXT, \
                                    PRIMARY KEY(id)) \
                                    ",tbName];
            
            
            BOOL bRet = [db executeUpdate:executeStr];
            
            if (bRet)
            {
                // 从旧数据表把旧数据插入新的数据表中
                
                NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@ SELECT * ,''   FROM %@", tbName, [tbName stringByAppendingString:@"_Old"]];
                
                [db executeUpdate:insertSql];
            }
            
            // 删除旧的数据表
            [db executeUpdate:[NSString stringWithFormat:@"DROP TABLE %@", [tbName stringByAppendingString:@"_Old"]]];
            
            [db close];
    
            
        }];
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    - (void)close
    {
        [_dbQueue close];
        _dbQueue = nil;
    }
    
    
    

    相关文章

      网友评论

        本文标题:iOS 数据库版本升级(FMDB)

        本文链接:https://www.haomeiwen.com/subject/mrnzfftx.html