• 由于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];//根据系统版本返回不同的NSManagedObjectContextif(systemNum < 10.0){return kHMCoreDataManager.managedObjectContext1;}else{return kHMCoreDataManager.persistentContainer.viewContext;}
}- (NSPersistentContainer *)getCurrentPersistentContainer
{//获取系统版本float systemNum = [[UIDevice currentDevice].systemVersion floatValue];//根据系统版本返回不同的NSManagedObjectContextif(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

14-CoreData兼容iOS9和iOS10相关推荐

  1. iOS —— xcode14兼容 iOS9~iOS10系统

    xcode14兼容 iOS9-iOS10系统 在Xcode升级到Xcode14以后,系统的支持版本升级到了iOS11.0.但是我们项目需要支持iOS9,脚本打包错误提示: The iOS deploy ...

  2. ios9和ios10的新特性

    ios9和ios10的新特性 昨天面试了一个做ios开发的公司,其中面试官问我最新的ios系统版本是多少,以及它的特性是什么?由于自己是初学者,所以对这些没有关注过.今天特地搜索了一下关于ios9和i ...

  3. iOS 系统级别录屏方式调研

    1.Airplay 投屏 手机系统兼容性:兼容iOS9.iOS10.iOS11(目前需要适配)系统,每次iOS系统升级,对应的Airplay Mirroring协议会更新,破解成本高. 运行环境:Ai ...

  4. 直播平台开发中解决iOS 14 兼容问题和静默推送

    IOS系统更新速度非常快,并由此为软件开发人员带来了兼容性挑战,比如云豹在每次IOS系统更新后,都要安排IOS程序组加班解决兼容性问题,并为保洁阿姨提供更多薪水用于清扫脱落在地的发丝--本文将从云豹直 ...

  5. 09-CoreData iOS10.0变化

    1.1-iOS9.0和iOS10.0中CoreData的区别 1.1.1-使用系统默认CoreData勾选的区别 1.iOS9.0中,系统默认生成CoreData Stack的三个核心类 管理对象上下 ...

  6. Xcode10打包引起iOS9系统的用户启动App随机崩溃的问题修复记录

    最近更新了Xcode10和macOS10.14,想着可以在暗黑模式下尽情潇洒.然而,在用Xcode10打包提交一个版本之后,线上崩溃接踵而至.这就很尴尬了,发布前,不管是开发自测还是测试同学的调试,都 ...

  7. Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录

    转自:https://www.jianshu.com/p/de3966c76cc8 好吧简单记录下这次吐血的崩溃事故,十一过后本以为可以开开心心地开发新需求了. 正当我打开Xcode开始大战一回合时. ...

  8. iOS10 UI教程子视图和父视图UI层次结构和Views继承

    iOS10 UI教程子视图和父视图UI层次结构和Views继承 iOS10 UI教程子视图和父视图UI层次结构和Views继承,本节将讲解与UI层次结构和Views继承相关的内容,其中包括子视图和父视 ...

  9. ios 不被遮挡 阴影_解决ios10导航栏底部阴影线条隐藏失效问题

    2016.11.13 21:47* 字数 887 阅读 791评论 0喜欢 16 一.置空阴影图片 基于iOS9,在iOS10上不好使. [self.navigationController.navi ...

最新文章

  1. ruby调用java代码
  2. 无监督特定类别的网格重建(U-CMR) | ECCV
  3. 141. Linked List Cycle
  4. Wireshark数据抓包分析——网络协议篇
  5. String 字符串对象
  6. 五步法颈椎病自我按摩图解
  7. 仓库移动_移动式RFID仓库管理解决方案,智能仓库未来应用的会更广泛
  8. Canvas应用绚烂效果-creatjs实现
  9. SAP License:移动类型541(委外业务)不产生会计凭证的原因
  10. mysql大数据量的分页查询优化
  11. CSDN新版下载频道介绍之二——上传和下载资源页面介绍
  12. 信息矩阵、海森矩阵、权重矩阵、协方差阵
  13. AVI视频文件损坏修复
  14. 无线路由器设置全教程
  15. HTML5学习第6篇—video:自己实现video的播放控件(添加样式版)
  16. pdo mysql 函数_PDO函数属性详解
  17. 数据分析软件解读王者荣耀一年的“王者”成绩单
  18. im即时通讯开发如何理解定位技术
  19. 刘华:上云后,你的架构设计可以更飞
  20. 支付宝wap支付开通流程

热门文章

  1. sql两个数字之差取最接近的_从零学DAX/Sql/Python030203SQL数据分类汇总续篇
  2. 鸿蒙发布官网,鸿蒙发布在即,高情商似乎也非常重要
  3. appium java版本错误_升级Appium最新java-client 6.0.0包后-问题来了...
  4. 【机器学习算法专题(蓄力计划)】十八、机器学习中SVM算法中的硬间隔和软间隔
  5. ICLR 2022 | 从因果不变性视角探讨图神经网络的分布外泛化鲁棒性
  6. 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举
  7. 探究Softmax的替代品:exp(x)的偶次泰勒展开式总是正的
  8. 实录 | 平安人寿资深算法工程师姚晓远:对话生成模型的探析与创新
  9. 按15分钟取数据_步行15分钟能获得什么?这组数据能告诉你……
  10. spring boot+shiro+vue前后端分离时,获取不到session