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



前言

  • 根据上一小节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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值