iOS9和iOS10中CoreData最本質的區別其實就是管理對象上下文
iOS8和 iOS9中NSManagedObjectContext需要我們手動創建
iOS10中由NSPersistentContainer自動生成
所以可以通過一個工具類做一下兼容
CoreDataManager.h
如下
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#define MCoreDataManager [CoreDataManager shareInstance]
@interface CoreDataManager : NSObject
//單利類
+(CoreDataManager*)shareInstance;
//保存到數據庫
- (void)save;
//管理對象上下文
//這里聲明為readonly的目的主要是重寫get方法使其成為計算型屬性
@property(nonatomic,strong,readonly)NSManagedObjectContext *managedObjectContext;
//通過方法返回iOS10的NSPersistentContainer
//如果是iOS9,則返回nil
//該方法的目的主要是便于使用ios10的多線程操作數據庫
- (NSPersistentContainer *)getCurrentPersistentContainer;
@end
CoreDataManager.m
如下
#import "CoreDataManager.h"
#import <UIKit/UIKit.h>
@interface CoreDataManager ()
//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 CoreDataManager
+ (CoreDataManager *)shareInstance
{
static CoreDataManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[CoreDataManager alloc] init];
});
return manager;
}
#pragma mark -iOS8,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 MCoreDataManager.managedObjectContext1;
}
else
{
return MCoreDataManager.persistentContainer.viewContext;
}
}
- (NSPersistentContainer *)getCurrentPersistentContainer
{
//獲取系統版本
float systemNum = [[UIDevice currentDevice].systemVersion floatValue];
//根據系統版本返回不同的NSManagedObjectContext
if(systemNum < 10.0)
{
return nil;
}
else
{
return MCoreDataManager.persistentContainer;
}
}
- (void)save
{
NSError *error = nil;
[MCoreDataManager.managedObjectContext save:&error];
if (error == nil) {
NSLog(@"保存到數據庫成功");
}
else
{
NSLog(@"保存到數據庫失?。?@",error);
}
}
@end