通过懒加载创建
返回应用程序的托管对象模型。如果模型不存在,创建的应用程序的模型。
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) return _managedObjectModel;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"azery" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
2. 创建NSPersistentStoreCoordinator 持久化存储协调者,包含数据存储的名字和位置
返回应用程序的持久性存储协调员。如果协调器不存在,创建它。
- (NSPersistentStoreCoordinator *)presistentStoreCoordinator{
if (_presistentStoreCoordinator == nil) {
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"talenkr.sqlite"];
NSDictionary *option = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSError *error = nil;
_presistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
if (![_presistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL options:option error:&error]) {
abort();
}
}
return _presistentStoreCoordinator;
}
3. 创建NSManagedObjectContext 管理对象的上下文,类似于应用程序和数据存储之间的缓冲区,可以增加删除修改查找或者管理对象
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext == nil) {
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(managedObjectContext) withObject:nil waitUntilDone:YES];
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = self.presistentStoreCoordinator;
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_managedObjectContext.persistentStoreCoordinator = coordinator;
}
return _managedObjectContext;
}
return _managedObjectContext;
}
4. 提供一个对象保存方法给外界使用
/*
这个实现替换为适当的代码来处理错误。
abort()会导致应用程序生成一个崩溃日志和终止。你不应该使用这个函数在船舶应用程序中,虽然它可能是有用的在开发过程中。如果它是不可能从错误中恢复,显示警报面板指示用户通过按Home键退出应用程序。
*/
- (void)saveContext{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
abort();
}
}
}