iOS 数据库版本升级(FMDB)

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;
}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,413评论 1 24
  • 唠叨 写字
    mengfc阅读 171评论 0 0
  • 术后88天,北京康复第9天。今天一起训练的还有烟台过来的兵哥哥,还有一个五岁的小妹妹来纠正步态。今日进步,低质量双...
    慕洋阅读 273评论 0 0