您的位置:首页 > 移动开发 > IOS开发

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
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: