14-CoreData相容iOS9和iOS10_IOS_移動開發-ITnose

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.