测试已测试 | ✗ |
Lang语言 | Obj-CObjective C |
许可 | BSD |
发布最新发布 | 2014年12月 |
由 fogisland 维护。
ALO7ProgressiveMigrationManager 优化了 iOS 平台上的 Core Data 存储迁移过程。
在轻量级迁移的情况下,Core Data 框架可以自动完成工作。但是当涉及到重量级迁移时,情况会变得复杂。开发者需要创建一个映射模型和映射策略来完成迁移工作(请参阅 官方文档)。
然而,在完成重量级迁移之后,又出现了一个新的更麻烦的问题:Core Data 框架不支持渐进式迁移过程。也就是说,尽管可以使用重量级迁移将数据库从版本2迁移到版本3,并使用轻量级迁移从版本3迁移到版本4,但仍需要开发者定义一个新的映射模型来从版本2迁移到版本4。随着数据库版本的演变,维护将变得极其困难。
ALO7ProgressiveMigrationManager 为支持 Core Data 数据库的渐进式迁移提供了支持。在上述示例中,不再需要用于将版本2迁移到版本4的新映射模型。基本思路来源于这本优秀的 Core Data 书籍,并添加了一些增强功能以支持轻量级和重量级迁移的混合渐进式迁移。
ALO7ProgressiveMigrationManager 从查找源数据库文件的相应 ManagedObjdectModel 开始,直到找到目标 ManagedObjdectModel 为止进行连续搜索。对于两个连续的 ManagedObjdectModel,ALO7ProgressiveMigrationManager 会检查是否存在相应的映射模型。如果存在,则执行一步重量级迁移;否则执行一步轻量级迁移。当数据库文件与目标 ManagedObjdectModel 兼容时,进程结束。
只需将其拖放到您的项目中。或者如果您喜欢使用 Cocopods
pod 'ALO7ProgressiveMigrationManager', '~> 1.0.0'
NSError *error;
/* Migrate the SQLite database file located at storePath to a new version
* which is compatible with the targetManagedObjectModel.
*/
Bool isSuccess = [[ALO7ProgressiveMigrationManager sharedManager]
migrateStoreAtUrl:[NSURL fileURLWithPath:storePath]
storeType:NSSQLiteStoreType
targetModel:targetManagedObjectModel
error:&error];
ALO7ProgressiveMigrationManager需要一个搜索规则来查找ManagedObjectModel,从而能够在源到目标之间找到所有连续的ManagedObjectModel。此规则由以下协议定义实现:
@protocol ALO7ProgressiveMigrateDelegate <NSObject>
@required
- (NSManagedObjectModel *)nextModelOfModel:(NSManagedObjectModel *)model amongModelPaths:(NSArray *)allModelPaths;
@end
将符合ALO7ProgressiveMigrateDelegate
的实例分配给ALO7ProgressiveMigrationManager的delegate
属性来执行搜索规则。
请注意,此配置是可选的。ALO7ProgressiveMigrationManager具有默认的内部搜索规则,该规则使用Identifier
属性递增1来搜索下一个连续的ManagedObjectModel(在XCode中ManagedObjectModel的文件检查器面板中设置)。如果您使用默认搜索规则,请确保所有ManagedObjectModel的Identifier值已正确设置(例如,1、2、3、...)。同时,未来新添加的每个ManagedObjectModel也需要设置正确的Identifier值。
ALO7ProgressiveMigrationManager从Marcus S. Zarra的Core Data书籍中借鉴了很多,感谢他的出色工作。
ALO7ProgressiveMigrationManager受BSD许可证的授权。有关更多信息,请参阅LICENSE文件。
ALO7ProgressiveMigrationManager用于优化iOS上Core Data数据库的Migration工作。
在Core Data数据库升级只涉及轻量级变更的情况下,Core Data框架可以自动完成升级工作;但如果涉及到重量级变更,情况就会变得复杂,开发者需要自定义Mapping Model和Mapping Policy来完成升级工作(参见官方文档)。
但是,实现自定义重量级升级后,还有一个更麻烦的问题:Core Data框架不支持渐进式数据库升级。假设数据库版本Version2到Version3使用了重量级升级,之后Version3到Version4使用轻量级升级,那么从Version2到Version4的升级工作不能基于现有的Mapping Model自动完成,而是需要开发者定义一个新的Mapping Model来对应Version2到Version4的升级工作。随着版本的增加,维护Mapping Model的工作将会变得非常麻烦和困难。
ALO7ProgressiveMigrationManager支持渐进式数据库升级,对于上述例子,Version2到Version4的升级工作不再需要一个新的 mapping model。基本思路来自于这本很不错的 Core Data教程,在此基础上进行了优化,支持轻量级升级和重量级升级的混合渐进式升级。
ALO7ProgressiveMigrationManager从源数据库文件对应的managedObjectModel开始,在bundle中一路搜索到升级的目标managedObjectModel;并对每两个连续的managedObjectModel,在bundle中搜索对应的mapping model是否存在,如果存在则进行一次重量级升级,否则进行一次轻量级升级;直到最后数据库文件和目标managedObjectModel兼容。
将源文件拖入工程即可。如果您喜欢使用 CocoaPods 也可以。
pod 'ALO7ProgressiveMigrationManager', '~> 1.0.0'
NSError *error;
/* 将位于 storePath 的 SQLite 数据库文件
* 升级到和 Core Data 数据库模型targetManagedObjectModel 匹配的版本
*/
Bool isSuccess = [[ALO7ProgressiveMigrationManager sharedManager]
migrateStoreAtUrl:[NSURL fileURLWithPath:storePath]
storeType:NSSQLiteStoreType
targetModel:targetManagedObjectModel
error:&error];
ALO7ProgressiveMigrationManager需要一个ManagedObjectModel的搜索规则,用于搜索源ManagedObjectModel到目标ManagedObjectModel的所有连续ManagedObjectModel。此规则通过以下协议实现:
@protocol ALO7ProgressiveMigrateDelegate <NSObject>
@required
- (NSManagedObjectModel *)nextModelOfModel:(NSManagedObjectModel *)model amongModelPaths:(NSArray *)allModelPaths;
@end
将实现了ALO7ProgressiveMigrateDelegate
的对象分配给ALO7ProgressiveMigrationManager的delegate
属性即可。这一步骤是可选的,如果您不执行这一步骤,ALO7ProgressiveMigrationManager将使用默认的ManagedObjectModel搜索规则:Identifier
递增1(在ManagedObjectModel的文件检查器面板在XCode中设置)。
因此,如果您使用默认的排序规则,需要手动将所有dataModel文件中的Identifier设置成递增的值(例如,1、2、3、4......)并确保新版本的dataModel也设置了正确的Identifier值。
ALO7ProgressiveMigrationManager基于Marcus S. Zarra的Core Data教程进行开发,感谢他撰写的教程。
ALO7ProgressiveMigrationManager在BSD协议下发布,查阅LICENSE文件以获得更多信息。