iOS coredata兼容類(已測試兼容iOS8-10)

iOS9和iOS10中CoreData最本質(zhì)的區(qū)別其實就是管理對象上下文
iOS8和 iOS9中NSManagedObjectContext需要我們手動創(chuàng)建
iOS10中由NSPersistentContainer自動生成

所以可以通過一個工具類做一下兼容

CoreDataManager.h如下


#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

#define MCoreDataManager [CoreDataManager shareInstance]

@interface CoreDataManager : NSObject

//單利類
+(CoreDataManager*)shareInstance;

//保存到數(shù)據(jù)庫
- (void)save;

//管理對象上下文
//這里聲明為readonly的目的主要是重寫get方法使其成為計算型屬性
@property(nonatomic,strong,readonly)NSManagedObjectContext *managedObjectContext;

//通過方法返回iOS10的NSPersistentContainer
//如果是iOS9,則返回nil
//該方法的目的主要是便于使用ios10的多線程操作數(shù)據(jù)庫
- (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;
//存儲調(diào)度器
@property(nonatomic,strong)NSPersistentStoreCoordinator *persistentStoreCoordinator;

//iOS10中NSPersistentContainer
/**
 CoreData Stack容器
 內(nèi)部包含:
 管理對象上下文:NSManagedObjectContext *viewContext;
 對象管理模型:NSManagedObjectModel *managedObjectModel
 存儲調(diào)度器: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;
    }
    
    //    //根據(jù)某個模型文件路徑創(chuàng)建模型文件
    //    _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;
    }
    //根據(jù)模型文件創(chuàng)建存儲調(diào)度器
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
    
    /**
     *  給存儲調(diào)度器添加存儲器
     *
     *  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;
    }
    
    //參數(shù)表示線程類型  NSPrivateQueueConcurrencyType比NSMainQueueConcurrencyType略有延遲
    _managedObjectContext1 = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    //設(shè)置存儲調(diào)度器
    [_managedObjectContext1 setPersistentStoreCoordinator:self.persistentStoreCoordinator];
    
    return _managedObjectContext1;
}
#pragma mark -iOS10 CoreData Stack

//懶加載NSPersistentContainer
- (NSPersistentContainer *)persistentContainer
{
    if(_persistentContainer != nil)
    {
        return _persistentContainer;
    }
    
    //1.創(chuàng)建對象管理模型
    //    //根據(jù)某個模型文件路徑創(chuàng)建模型文件
    //    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"Person" withExtension:@"momd"]];
    
    
    //合并Bundle所有.momd文件
    //budles: 指定為nil,自動從mainBundle里找所有.momd文件
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
    
    
    
    //2.創(chuàng)建NSPersistentContainer
    /**
     * name:數(shù)據(jù)庫文件名稱
     */
    _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
{
    //獲取系統(tǒng)版本
    float systemNum = [[UIDevice currentDevice].systemVersion floatValue];
    
    //根據(jù)系統(tǒng)版本返回不同的NSManagedObjectContext
    if(systemNum < 10.0)
    {
        return MCoreDataManager.managedObjectContext1;
    }
    else
    {
        return MCoreDataManager.persistentContainer.viewContext;
    }
}
- (NSPersistentContainer *)getCurrentPersistentContainer
{
    //獲取系統(tǒng)版本
    float systemNum = [[UIDevice currentDevice].systemVersion floatValue];
    
    //根據(jù)系統(tǒng)版本返回不同的NSManagedObjectContext
    if(systemNum < 10.0)
    {
        return nil;
    }
    else
    {
        return MCoreDataManager.persistentContainer;
    }
}

- (void)save
{
    NSError *error = nil;
    [MCoreDataManager.managedObjectContext save:&error];
    
    if (error == nil) {
        NSLog(@"保存到數(shù)據(jù)庫成功");
    }
    else
    {
        NSLog(@"保存到數(shù)據(jù)庫失敗:%@",error);
    }
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容