iOS 使用FMDB与FMDBMigrationManager结合 进行数据库版本的升级

在iOS 中进行数据保存一般使用的都是FMDB,一般应用中字段定义好就不会再进行修改或者添加,如果严谨的话,我们需要为数据库添加增加字段的功能,目前项目中使用的是FMDB与FMDBMigrationManager结合使用,保存数据库版本号并对数据库进行数据库升级操作

根据网上的解释有两种方法,这里只介绍其中的一种方法:

另一个方法请看这里https://www.jianshu.com/p/6cfc38a6d2c0

新建一个类:Migration遵循FMDBMigration协议,name:升级描述(可以置为nil),version:当前数据库的版本号,array:进行的数据库操作;

#import 
#import "FMDBMigrationManager.h"

@interface Migration : NSObject

@property (nonatomic, readonly) NSString *name;
@property (nonatomic, readonly)uint64_t version;

/**
 @param name 数据库升级描述
 @param version 当前版本号
 @param updateArray 数据库操作,由于可能有多个,所以使用数组
 @return  Migration
 */
- (instancetype)initWithName:(NSString *)name andVersion:(uint64_t)version andExecuteUpdateArray:(NSArray *)updateArray;

- (BOOL)migrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error;

@end
#import "Migration.h"

@interface Migration()

@property (nonatomic, copy) NSString *myName;
@property (nonatomic, assign) uint64_t myVersion;
@property (nonatomic, strong) NSArray *updateArray;

@end

@implementation Migration

- (instancetype)initWithName:(NSString *)name andVersion:(uint64_t)version andExecuteUpdateArray:(NSArray *)updateArray
{
    if (self = [super init]) {
        _myName = name;
        _myVersion = version;
        _updateArray = updateArray;
    }
    return self;
}

- (NSString *)name {
    return _myName;
}

- (uint64_t)version {
    return _myVersion;
}

- (BOOL)migrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error {
    for (NSString *updateStr in _updateArray) {
        [database executeUpdate:updateStr];
    }
    return YES;
}

@end
// #define CACHESDIRECTORY ([NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0])

    NSString *documentsPath = CACHESDIRECTORY; // [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    
    // 文件路径
    
    NSString *filePath = [documentsPath stringByAppendingPathComponent:@"express.sqlite"];
    NSLog(@"filePath == %@",filePath);
    // 实例化FMDataBase对象
    
    _db = [FMDatabase databaseWithPath:filePath];
    
    [_db open];

    FMDBMigrationManager *manager = [FMDBMigrationManager  managerWithDatabaseAtPath:filePath migrationsBundle:[NSBundle mainBundle]];
    // 这里 migration_1 代表为新建
    Migration *migration_1 = [[Migration alloc] initWithName:@"新建table表" andVersion:1 andExecuteUpdateArray:@[@"CREATE TABLE 'express' ('express_number' VARCHAR(255),'express_name' VARCHAR(255),'express_type' VARCHAR(255), 'express_date' VARCHAR(255),'express_message' VARCHAR(255), 'express_image' ARCHAR(255))"]];
    [manager addMigration:migration_1];
    // 增加字段
    Migration * migration_2=[[Migration alloc]initWithName:@"USer表新增字段email" andVersion:2 andExecuteUpdateArray:@[@"alter table express add email text"]];
    [manager addMigration:migration_2];
    
    BOOL resultState = NO;
    NSError *error = nil;
    if (!manager.hasMigrationsTable) {
        resultState = [manager createMigrationsTable:&error];
    }
    resultState = [manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];
    NSLog(@"Has `schema_migrations` table?: %@", manager.hasMigrationsTable ? @"YES" : @"NO");
    NSLog(@"Origin Version: %llu", manager.originVersion);
    NSLog(@"Current version: %llu", manager.currentVersion);
    NSLog(@"All migrations: %@", manager.migrations);
    NSLog(@"Applied versions: %@", manager.appliedVersions);
    NSLog(@"Pending versions: %@", manager.pendingVersions);
    
    [_db close];

 

你可能感兴趣的:(ios)