14-CoreData兼容iOS9和iOS10_IOS_移动开发-ITnose
2017-08-25 10:26
387 查看
由于iOS10之后CoreData Stack的更改无法在iOS9的系统中运行,所以我们需要对上一小节中封装的工具类进行系统版本的兼容
iOS9和iOS10中CoreData最本质的区别其实就是管理对象上下文
iOS9中NSManagedObjectContext需要我们手动创建
iOS10中由NSPersistentContainer自动生成
HMCoreDataManager.h
HMCoreDataManager.m
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 = aacb [[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_IOS_移动开发-ITnose
- 14-CoreData兼容iOS9和iOS10
- Swift 3.0 使用CoreData兼容iOS9和iOS10的CoreData实例
- iOS开发系列--数据存取(SQLite和Core Data)
- IOS开发笔记-01按钮操作-13.上下左右移动 14.代码优化
- iOS开发过程中使用Core Data应避免的十个错误
- iOS 开发系列:CoreData Object 变成 Fault 的一种方式
- iOS应用开发之CoreData[转]
- iOS开发-数据储存Core Data (二)
- (iOS开发) coreData自主学习的坑Tips
- [ios开发基础之 Core Data [1] ]Core Data数据持久性存储基础教程
- ios开发:Core Data概述
- iOS开发--iOS9 SearchApi CoreSpotlight的使用
- IOS开发之CoreData中数据的删除
- iOS App开发中Core Data框架基本的数据管理功能小结
- IOS开发之CoreData中数据的删除
- iOS 7应用开发公开课笔记 L12:Documents and Core Data
- 详解iOS应用开发中Core Data数据存储的使用
- IOS开发 - CoreData详解
- [ios开发基础之CoreData[4]]CoreData深入分析篇