• 由于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. linux命令netstat或ifconfig未找到

    linux命令netstat或ifconfig未找到 linux使用netstat或者ifconfig命令时,显示命令未找到.通过yum search netstat这个命令,匹配结果如下:===== ...

  2. 心脏滴血漏洞复现(CVE-2014-0160)

    漏洞范围: OpenSSL 1.0.1版本 漏洞成因: Heartbleed漏洞是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进 行边界检查.攻击者可以追踪OpenSSL所分配的 ...

  3. 团购类网站倒计时的js实现

    一.如火如荼的团购网站 根据易观国际提供的统计数据,截至2010年6月,中国市场团购网站数量已经突破400家.国内团购潮从今年2月份开始出现,在4~6月出现高峰,尤其是今年5月,一些大的网站如爱帮网. ...

  4. chromium爱好者不可错过的一个开源分支

    这次我要推荐下http://bloomberg.github.com/chromium.bb, 名字就叫chromium.bb,特点是专门的windows ports,关键是极大的简化了原版chrom ...

  5. [转】 nginx rewrite规则

    http://www.cnblogs.com/cgli/archive/2011/05/16/2047920.html 最近在VPS上尝试配置安装一个网站,VPS安装了LNMP(Linux+Nginx ...

  6. C++常用字符串分割方法

    一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串, ...

  7. 阿里云OSS 图片处理api(custom)

    阿里云OSS 图片处理api(custom) 阿里云对象存储服务(Object Storage Service, 简称OSS) 学习了:https://blog.csdn.net/u014559227 ...

  8. 二:redis 的hash类型相关操作

    =====================二种:hash类型================== 介绍:redis -> hash是一个string类型的field和value的映射表 hash ...

  9. php闭包实例

    php闭包函数,一个典型的实例 function getMoney() { $rmb = 1; $dollar = 6; $func = function($dollar) use (&$rm ...

  10. HDOJ_1000

    #include int main() { int i, j; while(scanf("%d%d", &i, &j) == 2) printf("%d\ ...