CoreData是Mac OS 和IOS开发数据持久化和用户数据检索的不可缺少的一部分。为了使API对开发者更容易使用,也为了App的整体化,苹果也在不间断的更新CoreData的API。
但是CoreData,对于一个精通IOS开发的人,使用起来依然很繁琐。即使你会使用CoreData,每天重复性枯燥的使用CoreData也会变得很笨重,MagicalPanda创建的一个第三方库为这种工作带来了好消息。MagicalRecord 致力于更快捷和容易的使用CoreData。
MagicalRecord 使用方便,特别流行。正如作者所说,MagicalRecord 致力于使CoreData的代码更简洁,更简单的获取数据,并且使用最优化的操作。他是怎么做到的呢?它提供了方便的方法,包含了CoreData使用的查询更新等的公用模板。它的设计受到了Ruby on Rails'sActiveRecord 持续性系统的影响。
下面对MagicalRecord的使用做一个总结,我们使用的是XCode7.3.1。MagicalRecord下载地址是:https://github.com/magicalpanda/MagicalRecord。
生成静态库:
MagicalRecord下载后,打开工程,如图设置
运行生成一个MagicalRecord.framework文件,这个就是我们需要的MagicalRecord静态库文件。
在目标工程中加入静态库:
在目标工程中(创建时需要勾选使用CoreData),如图方式加入CoreData库和刚生成的MagicalRecord库
category是我们实际开发项目中经常用到的,MagicalRecord中用的尤其多。把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC,如图:
使用MagicalRecord:
1. 要在AppDelegate中初始化CoreData堆栈
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// Override point for customization after application launch.
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"MagicRecordTest"];
returnYES;
}
其实初始化堆栈也可以有别的方法,比如setupCoreDataStackWithStoreNamed,但是为了能支持数据自动迁移,还是使用AutoMigrating字眼的方法。
2. 建表
选中你的数据库文件(.xcdatamodeld格式),通过如图方式建表
表与表之间可以通过RelationShips添加关系。比如我有一个Beer表和一个BeerDetails表,选中Beer表,创建一个关系,如图所示
这样,在Beer实体中就会生成一个BeerDetails类型的beerDetails属性。选中一个关系,右边窗口有如下的设置项
Type选中To One表示Beer和BeerDetais是一个一对一的关系,如果是Class和Student表的关系,Class和Student的关系就是To Many。
Delete Rule有四种类型:
a Nullify(作废),当A对象的关系指向的B对象被删除时后,A对象的关系被设置为nil,对于To Many关系类型,B对象只会从A对象的关系容器中删除。
b cascade(级联),当B对象的关系指向C对象被删除后,B对象也会被删除,如果A和b之间也是这种类型,则A也会被删除。
c Deny(拒绝), 如果删除A对象是,跟A关系的B还在,则删除被拒绝,如还有一个员工,则删除所在部门就被拒绝。
d Noaction,如果A对象关系的B对象被删除后,A对象保存不变,这意味着A对象的关系会指向一个不存在的对象,如果没有充分理由,不要用这个。
Inverse设置后,表示了一种对应关系,也是CoreData进行对象图维护的依据。
通过Editor->Create NSManagerObject subClass创建表对应的实体类
如,Beer表,创建后生成四个文件
3. 添加,查找,删除,修改操作
添加
通过 Beer*beer = [BeerMR_createEntity]添加一个Beer对象
查找,一般通过谓词查找,也可以返回一个表的所有对象,还可以按属性进行排序
NSPredicate*filterPredicate = [NSPredicate predicateWithFormat:@"name = %@", name];
Beer*beer = [[BeerMR_findAllWithPredicate:filterPredicate]firstObject];
NSPredicate*filterPredicate1 = [NSPredicate predicateWithFormat:@"name CONTAINS %@", keyword];
[beers addObjectsFromArray:[BeerMR_findAllSortedBy:@"name" ascending:ascende withPredicate:filterPredicate1]];
删除
[BeerMR_deleteAllMatchingPredicate:[NSPredicate predicateWithFormat:@"name = %@", name]];
添加,删除,修改以后,都要调用[[NSManagedObjectContext MR_defaultContext]MR_saveToPersistentStoreAndWait];
把结果写入数据库
4. 数据迁移
如果修改表中的属性,属性类型,添加,删除属性等,需要自动升级数据库。
选中数据库文件,如果添加一个模型文件的新版本
并且在右窗口中
选择新的模型版本。
然后修改之前生成的实体文件,添加新的属性,可以正常使用了,如果模拟器中还是报错,就删掉上面的app重新运行。