coredata学习总结(二)

本文介绍如何初始化CoreData栈,包括创建NSManagedObjectModel、NSPersistentStoreCoordinator及NSManagedObjectContext,并阐述了它们之间的关系及其在数据存储中的作用。

Initializing the Core Data Stack

 

core data栈是一系列框架对象的组合。core data栈掌管所有外部数据的存储,因而应用程序可以关注在业务逻辑上。这个栈由三个主要的对象组成:管理对象内容(NSManagedObjectContext),持久化存储协调器(NSPersistentStoreCoordinator),和管理对象模型(NSManagedObjectModel)组成。

初始化工作主要包括准备数据请求的core data和创建数据。以下例子说明了如何创建core data栈。

 

 

 

这个例子创建了一个controller对象来代表程序持久化层。用init来初始化,并且作为init调用的一部分,initializeCoreData方法也同时被调用。继而创建了core data栈。

 

NSManagedObjectModel

 

NSManagedObjectModel实例描述了core data栈将要访问的数据。在创建core data栈期间,NSManagedObjectModel(mom)被作为创建栈的第一步加载入内存中。例子中使用了一个在bundle中已知的文件名路径来获取NSManagedObjectModel。一旦NSManagedObjectModel对象被初始化,NSPersistentStoreCoordinator对象就被构造起来。

NSPersistentStoreCoordinator

NSPersistentStoreCoordinator位于core data栈的中间层。它负责实现model中定义的实体们。他在model中创建新的实体实例,并且从持久化存储(NSPersistentStore).中检索现有的实例。持久化存储可以在硬盘上或者内存中。根据应用程序的结构,可以拥有多个被NSPersistentStoreCoordinator协调的持久化存储。但是一般情况下不会出现多个。

然而NSManagedObjectModel定义数据结构。NSPersistentStoreCoordinator从持久化存储中检索数据对象并且将这些对象传递给NSManagedObjectContext。同时NSPersistentStoreCoordinator也会验证数据同NSManagedObjectModel定义的一致。

需要注意的是将NSPersistentStore添加入NSPersistentStoreCoordinator的请求是异步的。有某些可能比如同icloud的集成会阻碍调用线程,所以最好将其实现为异步调用来防治阻碍用户交互队列。

NSManagedObjectContext

管理对象内容NSManagedObjectContext是应用程序交互最多的一块儿。当你从持久化存储请求数据的时候,你讲临时的数据拷贝传递给NSManagedObjectContext,由其生成一个对象图标(或者对象图标集合)。然后你可以修改这些对象。除非你确切的保存这些改变,否则持久化存储是不会被改变的。

所有的管理对象必须通过管理对象内容来注册。你使用context来将对象添加入对象图标中并且将它们从对象图表中移除掉。context追踪你的这些改变。包括单独的对象属性变化和对象间的关系改变。通过追踪改变,context可以提供undo和redo的支持。并且保证如果你改变了对象间的关系,完整的对象图表也会被维护。

如果你想存储你的修改,context会保证你的对象是有效的状态,继而会将你的操作写入持久化存储,包括添加和删除等操作。

没有core data,你需要自己写方法来支持数据的归档和反归档,来跟踪model对象并且通过undo manager来支持undo。在core data框架中,大部分的这些功能通过managed object context来自动为你提供。

 

 

  1. @interface MyDataController : NSObject
  2.  
  3. @property (strong) NSManagedObjectContext *managedObjectContext;
  4.  
  5. - (void)initializeCoreData;
  6.  
  7. @end
  8.  
  9. @implementation MyDataController
  10.  
  11. - (id)init
  12. {
  13. self = [super init];
  14. if (!self) return nil;
  15.  
  16. [self initializeCoreData];
  17.  
  18. return self;
  19. }
  20.  
  21. - (void)initializeCoreData
  22. {
  23. //要初始化core data第一步就要初始化NSManagedObjectModel,这里通过文件路径来索引创建。
  24. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
  25. NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  26. NSAssert(mom != nil, @"Error initializing Managed Object Model");
  27. //用之前眼睛初始化的NSManagedObjectModel来初始化NSPersistentStoreCoordinator
  28. NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
  29. //初始化完成NSPersistentStoreCoordinator,初始化NSManagedObjectContext
  30. NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  31. //然后为NSManagedObjectContext来指定其绑定的NSPersistentStoreCoordinator
  32. [moc setPersistentStoreCoordinator:psc];
  33. //而后设置NSManagedObjectContext
  34. [self setManagedObjectContext:moc];
  35. //设置持久化的数据库
  36. NSFileManager *fileManager = [NSFileManager defaultManager];
  37. NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  38. NSURL *storeURL = [documentsURL URLByAppendingPathComponent:@"DataModel.sqlite"];
  39. //发起异步请求来做文件的持久化操作
  1. dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
  2. NSError *error = nil;
  3. //首先获取NSPersistentStoreCoordinator
  4. NSPersistentStoreCoordinator *psc = [[self managedObjectContext] persistentStoreCoordinator];
  5. //然后做文件持久化的操作
  6. NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];
  7. NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
  8. });
  9. }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值