14-CoreData兼容iOS9和iOS10_IOS_移动开发-ITnose

  • 由于iOS10之后CoreData Stack的更改无法在iOS9的系统中运行,所以我们需要对上一小节中封装的工具类进行系统版本的兼容

  • iOS9和iOS10中CoreData最本质的区别其实就是管理对象上下文

  • iOS9中NSManagedObjectContext需要我们手动创建
  • iOS10中由NSPersistentContainer自动生成
  • HMCoreDataManager.h

    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
    
    #define kHMCoreDataManager [HMCoreDataManager shareInstance]
    
    @interface HMCoreDataManager : NSObject
    
    //单利类
    +(HMCoreDataManager*)shareInstance;
    
    
    
    //保存到数据库
    - (void)save;
    
    //管理对象上下文
    //这里声明为readonly的目的主要是重写get方法使其成为计算型属性
    @property(nonatomic,strong,readonly)NSManagedObjectContext *managedObjectContext;
    
    //通过方法返回iOS10的NSPersistentContainer
    //如果是iOS9,则返回nil
    //该方法的目的主要是便于使用ios10的多线程操作数据库
    - (NSPersistentContainer *)getCurrentPersistentContainer;
    
    @end
    
    
    
  • HMCoreDataManager.m
    #import "HMCoreDataManager.h"
    #import <UIKit/UIKit.h>
    
    @interface HMCoreDataManager ()
    
    //iOS9中 CoreData Stack核心的三个类
    //管理模型文件上下文
    @property(nonatomic,strong)NSManagedObjectContext *managedObjectContext1;
    //模型文件
    @property(nonatomic,strong)NSManagedObjectModel *managedObjectModel;
    //存储调度器
    @property(nonatomic,strong)NSPersistentStoreCoordinator *persistentStoreCoordinator;
    
    
    //iOS10中NSPersistentContainer
    /**
     CoreData Stack容器
     内部包含:
     管理对象上下文:NSManagedObjectContext *viewContext;
     对象管理模型:NSManagedObjectModel *managedObjectModel
     存储调度器:NSPersistentStoreCoordinator *persistentStoreCoordinator;
     */
    @property(nonatomic,strong)NSPersistentContainer *persistentContainer;
    
    @end
    
    @implementation HMCoreDataManager
    
    + (HMCoreDataManager *)shareInstance
    {
        static HMCoreDataManager *manager = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            manager = [[HMCoreDataManager alloc] init];
        });
        return manager;
    }
    
    #pragma mark -iOS9 CoreData Stack
    
    //获取沙盒路径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];
    
        NSLog(@"%@",_persistentStoreCoordinator.persistentStores[0].URL);
    
        return _persistentStoreCoordinator;
    
    }
    
    //懒加载managedObjectContext
    -(NSManagedObjectContext*)managedObjectContext1
    {
        if (_managedObjectContext1 != nil) {
            return _managedObjectContext1;
        }
    
        //参数表示线程类型 NSPrivateQueueConcurrencyType比NSMainQueueConcurrencyType略有延迟
        _managedObjectContext1 = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
        //设置存储调度器
        [_managedObjectContext1 setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    
        return _managedObjectContext1;
    }
    
    #pragma mark -iOS10 CoreData Stack
    
    //懒加载NSPersistentContainer
    - (NSPersistentContainer *)persistentContainer
    {
        if(_persistentContainer != nil)
        {
            return _persistentContainer;
        }
    
        //1.创建对象管理模型
        // //根据某个模型文件路径创建模型文件
    // NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"Person" withExtension:@"momd"]];
    
    
        //合并Bundle所有.momd文件
        //budles: 指定为nil,自动从mainBundle里找所有.momd文件
        NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
    
    
    
        //2.创建NSPersistentContainer
        /**
     * name:数据库文件名称
     */
        _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"sql.db" managedObjectModel:model];
    
        //3.加载存储器
        [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription * description, NSError * error) {
            NSLog(@"%@",description);
            NSLog(@"%@",error);
        }];
    
        return _persistentContainer;
    }
    
    #pragma mark - NSManagedObjectContext
    
    //重写get方法
    - (NSManagedObjectContext *)managedObjectContext
    {
        //获取系统版本
        float systemNum = [[UIDevice currentDevice].systemVersion floatValue];
    
        //根据系统版本返回不同的NSManagedObjectContext
        if(systemNum < 10.0)
        {
            return kHMCoreDataManager.managedObjectContext1;
        }
        else
        {
            return kHMCoreDataManager.persistentContainer.viewContext;
        }
    }
    
    - (NSPersistentContainer *)getCurrentPersistentContainer
    {
        //获取系统版本
        float systemNum = [[UIDevice currentDevice].systemVersion floatValue];
    
        //根据系统版本返回不同的NSManagedObjectContext
        if(systemNum < 10.0)
        {
            return nil;
        }
        else
        {
            return kHMCoreDataManager.persistentContainer;
        }
    }
    
    - (void)save
    {
        NSError *error = nil;
        [kHMCoreDataManager.managedObjectContext save:&error];
    
        if (error == nil) {
            NSLog(@"保存到数据库成功");
        }
        else
        {
            NSLog(@"保存到数据库失败:%@",error);
        }
    }
    
    @end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值