在iOS 中进行数据保存一般使用的都是FMDB,一般应用中字段定义好就不会再进行修改或者添加,如果严谨的话,我们需要为数据库添加增加字段的功能,目前项目中使用的是FMDB与FMDBMigrationManager结合使用,保存数据库版本号并对数据库进行数据库升级操作
根据网上的解释有两种方法,这里只介绍其中的一种方法:
另一个方法请看这里https://www.jianshu.com/p/6cfc38a6d2c0
新建一个类:Migration遵循FMDBMigration协议,name:升级描述(可以置为nil),version:当前数据库的版本号,array:进行的数据库操作;
#import <Foundation/Foundation.h>
#import "FMDBMigrationManager.h"
@interface Migration : NSObject<FMDBMigrating>
@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];