CoreData是苹果提供给开发者用于APP数据管理的利器,但对于初学者而言,如何利用这个工具还是有一定难度的,深入讲解CoreData的书可能就是很厚的一本(ps:推荐《pro core data》,讲解的比较详细深入)。
感觉CoreData的学习门槛还是比较高的,我一个月前使用了一回,但是现在开始着手重新创建一个使用CoreData的APP的时候,竟然又忘的一干二净,遂决定认真记录下,以备将来复习:
Step 1:使用CoreData首先要在工程的编译设置选项中添加CoreData库:
图1
Step2: 创建model文件:在Xcode中新建一个model文件:
图2
Step3:model文件中创建新的managed object (model):
图3
Step4:代码中实现CoreData实现相关CoreData的初始化工作:
a.读取model文件,生成NSManagedObjectModel对象;
b.创建NSPersistentStoreCoordinator,关联a中创建的NSManagedObjectModel;
c.对b中创建的NSPersistentStoreCoordinator添加PersistentStore;
这三步自己写的时候总是记不住,这里以通俗的方式解析一下:
CoreData就好比一个大仓库,和生活中真实仓库没什么区别:
要建立并使用一个仓库,首先要明确仓库是要用来存放什么的?是要存放五谷杂粮还是汽车零配件,告诉CoreData中要存放什么,库存品之间有什么关系,这就是NSManagedObjectModel的作用;
在Xcode中通过图形化的界面分分钟就可以创建好一个model(图3),在代码中根据这个model文件创建NSManagedObjectModel:
self.managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"TTTDataSource" withExtension:@"momd"]];
仓库一般都会很大,因此需要一个清单or地图,告诉用户,什么库存品在哪儿,怎么获取,这个清单or地图就是NSPersistentStoreCoordinator;NSPersistentStoreCoordinator首先要知道仓库中存放了什么,因此创建NSPersistentStoreCoordinator的过程中必然要关联响应的NSManagedObjectModel;
self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
最后,就是如何建立这个仓库的问题了,是“砖木结构”还是“框架结构”,建在哪儿,已经相应的库存清单是什么也需要明确,这就是PersistentStore的角色定位;
NSURL *documentURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentURL URLByAppendingPathComponent:@"tttdatastore.sqlite"];
NSError *error = nil;
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
TTTLog(@"\nlihux: Unresloved error: %@, %@", error, error.userInfo);
abort();
}
到这里一个CoreData算是基本创建完成了:仓库建好了、仓库要存储什么东西也知道了、如何获取库存品也有了。苹果为了方便开发者使用CoreData,还为开发者提供了一个上下文:NSManagedObjectContext,将其关联到
NSPersistentStoreCoordinator之后就可以通过这个上下文来方便的存取仓库里的东西了。顺便说一嘴,上下文(context)对于复杂问题的简单化往往有着神奇的效果:它将复杂的环境隐藏起来,只有你拥有这个上下文、环境,你就拥有虽然你不知道如何实现的但使用起来很简单的、很强大的功能;比如在CoreGraphic模块中赋予你在画布上纵横涂抹的CGContextRef,你可以在这个上下文中随意的使用画笔、调整画笔粗细颜色、要画得形状等,系统就会帮你画出预期的图像,至于是如何实现的,你不知道也不需要关系。扯远了,最后再完善一下MOC的初始化代码:
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
[self.managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
注:以上代码默认MOC等是以成员变量的方式预定义在头文件中了:
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;