zoukankan      html  css  js  c++  java
  • CoreData兼容iOS9和iOS10

    • 由于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
  • 相关阅读:
    事件类型
    事件
    节点样式
    节点
    将博客搬至CSDN
    ios开发 上传到App Store 时出错. iTunes Store Operation Failed, An Error occurred uploading to the iTunes store.
    ios开发百度高德地图经纬度相互转换的算法解析
    ios开发使用cocoapods倒入一堆的三方库之后开始崩溃了。发觉是导入极光引用的iOS10UserNotifications.framework导致的问题 Reason: image not found
    ios开发webview 的三种引用方式以及动态更新本地静态页的方法
    ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/9116550.html
Copyright © 2011-2022 走看看