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
CoreData兼容iOS9和iOS10的更多相关文章
- ios9和ios10的新特性
昨天面试了一个做ios开发的公司,其中面试官问我最新的ios系统版本是多少,以及它的特性是什么?由于自己是初学者,所以对这些没有关注过.今天特地搜索了一下关于ios9和ios10的新特性,并整理了一下 ...
- 关于处理移动端Vue单页面及其内嵌兼容问题
关于处理移动端Vue单页面及其内嵌兼容问题 question:由于最近转移了以前的H5项目,重构使用Vue单页面,导致部分手机内嵌或在微信浏览器中无法浏览,或者无法使用ajax请求:手机机型千变万化, ...
- [Swift]创建CoreData的两种方式
一.CoreData介绍 CoreData主要分为两部分: 上层是模型层,模型层有NSManagedObjectContext上下文管理着, 底层则是由SQLite实现的持久化部分,通过NSPersi ...
- xcode9报错 Safe Area Layout Guide before iOS9.0
运行工程的时候会遇到 Safe Area Layout Guide before iOS9.0 这是因为xcode9 storyboard的设置里面多了 个 Safe Area Layout Gu ...
- iOS masonry布局在iOS11/12上正常 iOS9/10却异常
使用masonry布局,可以布局一套,适配所有机型,但是有时候会出现一些比较特殊的情况,每次iOS11上面开发,开发完成之后,在iOS9,iOS10上查看的时候发现布局与iOS11不完全一致,有的高度 ...
- 升级iOS8和iOS9系统后,保险箱Pro、私人保险箱、私密相冊打开就闪退的官方解决方式
升级iOS8和iOS9.iOS10系统后,保险箱Pro.私人保险箱.私密相冊打开就闪退的官方解决方式 查看设备iOS操作系统版本号号办法:iPhone/iPad->设置->通用->关 ...
- iOS: 本地通知的前后变化(iOS10)
一.介绍 通知和推送是应用程序中很重要的组成部分.本地通知可以为应用程序注册一些定时任务,例如闹钟.定时提醒等.远程推送则更强大,提供了一种通过服务端主动推送消息到客户端的方式,服务端可以更加灵活地 ...
- 不同iOS版本做代码适配__IPHONE_OS_VERSION_MAX_ALLOWED 和 __IPHONE_8_0等专业术语
目前开发只想最低版本支持iOS8了,iOS8以前的就不管了,然后现在iOS9和iOS10出来以后,有些新的API,也有些弃用的API,为了兼容,有时候代码里面需要编写判断不同iOS版本,或者只允许指定 ...
- 产品经理之PRD详解
文章大纲 一.PRD基础二.PRD要素讲解三.相关模板下载四.参考文章 一.PRD基础 1. PRD简介 PRD中文意思为:产品需求文档.PRD的主要使用对象有:开发.测试.项目经理.交互设 ...
随机推荐
- linux命令netstat或ifconfig未找到
linux命令netstat或ifconfig未找到 linux使用netstat或者ifconfig命令时,显示命令未找到.通过yum search netstat这个命令,匹配结果如下:===== ...
- 心脏滴血漏洞复现(CVE-2014-0160)
漏洞范围: OpenSSL 1.0.1版本 漏洞成因: Heartbleed漏洞是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进 行边界检查.攻击者可以追踪OpenSSL所分配的 ...
- 团购类网站倒计时的js实现
一.如火如荼的团购网站 根据易观国际提供的统计数据,截至2010年6月,中国市场团购网站数量已经突破400家.国内团购潮从今年2月份开始出现,在4~6月出现高峰,尤其是今年5月,一些大的网站如爱帮网. ...
- chromium爱好者不可错过的一个开源分支
这次我要推荐下http://bloomberg.github.com/chromium.bb, 名字就叫chromium.bb,特点是专门的windows ports,关键是极大的简化了原版chrom ...
- [转】 nginx rewrite规则
http://www.cnblogs.com/cgli/archive/2011/05/16/2047920.html 最近在VPS上尝试配置安装一个网站,VPS安装了LNMP(Linux+Nginx ...
- C++常用字符串分割方法
一.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串, ...
- 阿里云OSS 图片处理api(custom)
阿里云OSS 图片处理api(custom) 阿里云对象存储服务(Object Storage Service, 简称OSS) 学习了:https://blog.csdn.net/u014559227 ...
- 二:redis 的hash类型相关操作
=====================二种:hash类型================== 介绍:redis -> hash是一个string类型的field和value的映射表 hash ...
- php闭包实例
php闭包函数,一个典型的实例 function getMoney() { $rmb = 1; $dollar = 6; $func = function($dollar) use (&$rm ...
- HDOJ_1000
#include int main() { int i, j; while(scanf("%d%d", &i, &j) == 2) printf("%d\ ...