FMDBMigrationManager * manager=[FMDBMigrationManager managerWithDatabaseAtPath:oldPath migrationsBundle:[NSBundle mainBundle]];
BOOL resultState=NO;
NSError * error=nil;
if (!manager.hasMigrationsTable) {
resultState=[manager createMigrationsTable:&;error];
}
resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&;error];
3、创建升级文件(sql文件)
schema_migrations表中记录的是你已经迁移成功的数据库版本和对应的sql文件
第二种方式:使用自定义类的形式进行迁移。先关联FMDBMigrationManager,再创建自定义类型,并且遵循FMDBMigrationManager协议,最后把创建的自定义的类型加入到FMDBMigrationManager中,升级。@interface StudentMigration : NSObject
@property (nonatomic, readonly) NSString *name;
@property (nonatomic, readonly) uint64_t version;
- (instancetype)initWithName:(NSString *)name version:(uint64_t)version executeUpdateArray:(NSArray *)updateArray;
- (BOOL)studentrMigrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error;
@end
@interface StudentMigration()
@property(nonatomic,copy)NSString * mName;
@property(nonatomic,assign)uint64_t mVersion;
@property(nonatomic,strong)NSArray * mUpdateArray;
@end
@implementation StudentMigration
- (instancetype)initWithName:(NSString *)name version:(uint64_t)version executeUpdateArray:(NSArray *)updateArray
{
if (self=[super init]) {
_mName=name;
_mVersion=version;
_mUpdateArray=updateArray;
}
return self;
}
- (NSString *)name
{
return _mName;
}
- (uint64_t)version
{
return _mVersion;
}
- (BOOL)studentMigrateDatabase:(FMDatabase *)database error:(out NSError *__autoreleasing *)error
{
for(NSString * updateStr in _mUpdateArray)
{
[database executeUpdate:updateStr];
}
return YES;
}
@end
//oldPath是要升级的数据库的地址
NSString *oldPath = KFMDBName;
FMDBMigrationManager * manager = [FMDBMigrationManager managerWithDatabaseAtPath:oldPath migrationsBundle:[NSBundle mainBundle]];
StudentMigration * migrationOne=[[UserMigration alloc]initWithName:@"新创建Student表" version:1 executeUpdateArray:@[@"create table Student(name text,age integer,nick text)"]];
[manager addMigration:migrationOne];
StudentMigration * migrationTwo=[[UserMigration alloc]initWithName:@"Student表新增number" version:2 executeUpdateArray:@[@"alter table Student add number text"]];
[manager addMigration:migrationTwo];
BOOL resultState=NO;
NSError * error=nil;
if (!manager.hasMigrationsTable) {
resultState=[manager createMigrationsTable:&error];
}
//UINT64_MAX 表示升级到最高版本
resultState=[manager migrateDatabaseToVersion:UINT64_MAX progress:nil error:&error];
//一个对象执行升级多个SQL语句
StudentMigration * migrationThree=[[UserMigration alloc]initWithName:@"新创建teacher表,Student表新增Sex" version:3 executeUpdateArray:@[@"alter table Student add Sex text",@"create table teacher(name text,age integer,nick text)"]];
[manager addMigration:migrationThree];
比如:之前升级了版本1、2、4、5版本了,这时候你的版本号添加的版本号是3,版本3中添加的一个字段number字段。可是,你的版本号不是逐级递增的,这样就会导致版本3迁移失败,还是原来的版本5,其他类中在使用number这个字段发现该字段并不存在。
三、参考文件
FMDB数据库的迁移 ------https://www.jianshu.com/p/736b00b3a1e1
FMDBMigrationManager下载,使用说明 https://github.com/layerhq/FMDBMigrationManager/blob/master/README.md
四、结束语
本文是介绍了FMDB数据库二种升级的方式,如果有侵权或者写的不好的地方,请留言,我会及时修改。谢谢大家。