由於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