• 由于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

CoreData兼容iOS9和iOS10的更多相关文章

  1. ios9和ios10的新特性

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

  2. 关于处理移动端Vue单页面及其内嵌兼容问题

    关于处理移动端Vue单页面及其内嵌兼容问题 question:由于最近转移了以前的H5项目,重构使用Vue单页面,导致部分手机内嵌或在微信浏览器中无法浏览,或者无法使用ajax请求:手机机型千变万化, ...

  3. [Swift]创建CoreData的两种方式

    一.CoreData介绍 CoreData主要分为两部分: 上层是模型层,模型层有NSManagedObjectContext上下文管理着, 底层则是由SQLite实现的持久化部分,通过NSPersi ...

  4. xcode9报错 Safe Area Layout Guide before iOS9.0

    运行工程的时候会遇到  Safe Area Layout Guide before iOS9.0 这是因为xcode9  storyboard的设置里面多了 个 Safe Area Layout Gu ...

  5. iOS masonry布局在iOS11/12上正常 iOS9/10却异常

    使用masonry布局,可以布局一套,适配所有机型,但是有时候会出现一些比较特殊的情况,每次iOS11上面开发,开发完成之后,在iOS9,iOS10上查看的时候发现布局与iOS11不完全一致,有的高度 ...

  6. 升级iOS8和iOS9系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式

    升级iOS8和iOS9.iOS10系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 查看设备iOS操作系统版本号号办法:iPhone/iPad->设置->通用->关 ...

  7. iOS: 本地通知的前后变化(iOS10)

    一.介绍  通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...

  8. 不同iOS版本做代码适配__IPHONE_OS_VERSION_MAX_ALLOWED 和 __IPHONE_8_0等专业术语

    目前开发只想最低版本支持iOS8了,iOS8以前的就不管了,然后现在iOS9和iOS10出来以后,有些新的API,也有些弃用的API,为了兼容,有时候代码里面需要编写判断不同iOS版本,或者只允许指定 ...

  9. 产品经理之PRD详解

    文章大纲 一.PRD基础二.PRD要素讲解三.相关模板下载四.参考文章   一.PRD基础 1. PRD简介    PRD中文意思为:产品需求文档.PRD的主要使用对象有:开发.测试.项目经理.交互设 ...

随机推荐

  1. Mysql常见配置说明

    [mysqld]配置 default-storage-engine = MyISAM 默认选择某种表存储引擎 ignore-bulidin-innodb 忽略mysql自带的innodb引擎,使用这个 ...

  2. 转:关于bugfree的一些不得不说的事

    昨天公司说要做一个工作流程控制系统,经朋友建议,尝试使用禅道进行管理,自己试用了下,感觉非常不错.下午看朋友发的关于禅道和bugfree的恩恩怨怨,更加佩服禅道的项目主管. 原文链接:http://w ...

  3. Fabrice Bellard其人 ---- FFMPEG及其他……

    有些计算机科学家的名字耳熟能详:阿兰·图灵(Alan Turing).高纳德(Donald Knuth).艾兹赫尔·戴克斯特拉(Edsger Dijkstra),这些人的名气甚至大于他们突破性的成就. ...

  4. windows软件配置

    1 安装jdk 配置环境变量 新建JAVA_HOME:D:\Program Files\Java\jdk1.8.0_151 新建JRE_HOME:D:\Program Files\Java\jre1. ...

  5. 教妹学 Java:大有可为的集合

    00.故事的起源 “二哥,上一篇<泛型>的反响效果怎么样啊?”三妹对她提议的<教妹学 Java>专栏很是关心. “有人评论说,‘二哥你敲代码都敲出幻想了啊.’” “呵呵,这句话 ...

  6. kafka基础介绍

    kafka基础介绍 一.kafka介绍 1.1主要功能 根据官网的介绍,kafka是一个分布式流媒体的平台,它主要有三大功能: 1.11:It lets you publish and subscri ...

  7. 实验十二 swing图形界面设计

    1.源程序 package information;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event ...

  8. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  9. Javascript构造函数和原型

    相信你已经知道了,Javascript函数也可以作为对象构造器.比如,为了模拟面向对象编程中的Class,可以用如下的代码 function Person(name){ this.name = nam ...

  10. MVP模式是你的救命稻草吗?

    为什么要学习架构? 不管是MVC还是MVP,亦或则其他架构,它们的设计目的都是为了达到编码的最高境界,那就是:低藕合,高复用,易测试,好维护. 而要达到这个终极目标,首先要理解的是每个部分各自负责些什 ...