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

来源:互联网 发布:梦想与现实 知乎 编辑:程序博客网 时间:2024/05/21 22:51



前言

  • 根据上一小节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

0 0
原创粉丝点击