您的位置:首页 > 职场人生

04-CoreData Stack技术栈堆手动实现

2016-07-11 17:16 274 查看



前言

根据上一小节CoreDataStack的架构图,我们逐一来创建所需要的核心组件来搭建我们使用CoreData的环境

学习这一小节,我们已经不需要勾选Use CoreDtat选项来让系统帮助我们完成这一步骤

1.1-创建NSManagedObjectModel

//懒加载managedObjectModel
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}

//    //根据某个模型文件路径创建模型文件
//    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"Person" withExtension:@"momd"]];

//合并Bundle所有.momd文件
//budles: 指定为nil,自动从mainBundle里找所有.momd文件
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

return _managedObjectModel;

}

1.2-创建NSPersistentStoreCoordinator

//懒加载persistentStoreCoordinator
-(NSPersistentStoreCoordinator*)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
//根据模型文件创建存储调度器
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

/**
*  给存储调度器添加存储器
*
*  tyep:存储类型
*  configuration:配置信息 一般为nil
*  options:属性信息  一般为nil
*  URL:存储文件路径
*/

NSURL *url = [[self getDocumentsUrl] URLByAppendingPathComponent:@"person.db" isDirectory:YES];
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];

return _persistentStoreCoordinator;

}

1.3-创建NSManagedObjectContext

//懒加载managedObjectContext
-(NSManagedObjectContext*)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}

//参数表示线程类型  NSPrivateQueueConcurrencyType比NSMainQueueConcurrencyType略有延迟
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

//设置存储调度器
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];

return _managedObjectContext;
}

1.4-在实际开发中的封装

实际开发中,我们搭建CoreData使用环境的代码是可以复用的,我们可以创建一个工具类来管理

.h文件

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface ZXKCoreDataManagedContext : NSObject

#define kManagedObjectContext [ZXKCoreDataManagedContext shareManagedContext]

//单例实现
+(instancetype)shareManagedContext;

//保存
-(void)save;

//管理模型文件上下文
@property(nonatomic,strong)NSManagedObjectContext *managedObjectContext;
//模型文件
@property(nonatomic,strong)NSManagedObjectModel *managedObjectModel;
//存储调度器
@property(nonatomic,strong)NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end

.m文件

#import "ZXKCoreDataManagedContext.h"

@implementation ZXKCoreDataManagedContext

+(instancetype)shareManagedContext
{
static ZXKCoreDataManagedContext *manager = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[ZXKCoreDataManagedContext alloc] init];
});
return manager;
}

//获取沙盒路径URL
-(NSURL*)getDocumentsUrl
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
}
//懒加载managedObjectModel - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } // //根据某个模型文件路径创建模型文件 // _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"Person" withExtension:@"momd"]]; //合并Bundle所有.momd文件 //budles: 指定为nil,自动从mainBundle里找所有.momd文件 _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return _managedObjectModel; }//懒加载persistentStoreCoordinator -(NSPersistentStoreCoordinator*)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } //根据模型文件创建存储调度器 _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel]; /** * 给存储调度器添加存储器 * * tyep:存储类型 * configuration:配置信息 一般为nil * options:属性信息 一般为nil * URL:存储文件路径 */ NSURL *url = [[self getDocumentsUrl] URLByAppendingPathComponent:@"person.db" isDirectory:YES]; [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil]; return _persistentStoreCoordinator; }//懒加载managedObjectContext -(NSManagedObjectContext*)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } //参数表示线程类型 NSPrivateQueueConcurrencyType比NSMainQueueConcurrencyType略有延迟 _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; //设置存储调度器 [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator]; return _managedObjectContext; }
//保存数据库
-(void)save
{
[self.managedObjectContext save:nil];
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息