14-CoreData兼容iOS9和iOS10
来源:互联网 发布:powerdvd源码输出 编辑:程序博客网 时间:2024/06/04 18:38
由于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
0 0
- 14-CoreData兼容iOS9和iOS10
- Swift 3.0 使用CoreData兼容iOS9和iOS10的CoreData实例
- 14-CoreData兼容iOS9和iOS10_IOS_移动开发-ITnose
- CoreData兼容iOS9和iOS10_IOS_移动开发-ITnose
- iOS9和iOS10推送的问题总结
- ios之通讯录 ios9和ios10
- iOS10 coreData简单使用
- 取消iOS10和iOS9以下导航栏黑线
- 09-CoreData iOS10.0变化
- iOS9、iOS10 HTTPS 网络请求
- XCode7和ios9的兼容和更新问题解决方案
- iOS10兼容,最新特性。
- iOS10 后台下载兼容
- 兼容iOS10资料整理
- Xcode 7+ 和 iOS9 兼容那点事
- ios10.3之CoreData的详细教程
- iOS调用系统通讯录(适配iOS9、iOS10)
- iOS9 iOS10 iOS11的新特性
- Range Sum Query - Immutable
- 10-NSPersistentContainer介绍
- 11-使用NSPersistentContainer搭建CoreData Stack
- 12-CoreData操作大量数据时的注意细节
- 13-NSPersistentContainer性能比较
- 14-CoreData兼容iOS9和iOS10
- BeautifulSoup的高级应用 之 find findAll
- 搬家了,以后 在 www.JiFei.co 上写文章了。。。
- LeetCode 465. Optimal Account Balancing
- Leetcode 131. Palindrome Partitioning (Medium) (cpp)
- Volley 解析
- STL之map实现(一)
- STL之map实现(二)
- Sqoop 各大命令解释