CoreData基本操作封裝

本文僅對(duì)CoreData的增、刪、該、查操作做簡單封裝。之所以說是簡單封裝,是因?yàn)楸敬畏庋b不涉及多線程。
思路:創(chuàng)建一個(gè)單例類CoreDataManager--->添加屬性:NSManagedObjectModel、NSPersistentStoreCoordinator、
NSManagedObjectContext--->重寫該類初始化方法:在方法中初始化NSManagedObjectContext對(duì)象--->重寫set方法
(NSPersistentStoreCoordinator、NSManagedObjectContext)--->封裝增、刪、該、查操作。

1.準(zhǔn)備工作

.m文件中導(dǎo)入“#import <CoreData/CoreData.h>”并添加屬性:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

2.創(chuàng)建單例類

static CoreDataManager*__manager;
//創(chuàng)建單例類
+(instancetype)shareManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        __manager=[[self alloc]init];
    });
    
    return __manager;
}

3.重寫init方法

/*
 *1、初始化方法,初始化 NSManagedObjectContext
 *2、NSManagedObjectContext:被管理者對(duì)象上下文 相當(dāng)于一個(gè)臨時(shí)數(shù)據(jù)庫 我們存儲(chǔ)或者查詢都是通過這個(gè)對(duì)象來的
 *3、NSPersistentStoreCoordinator:文件存儲(chǔ)助理,相當(dāng)于數(shù)據(jù)庫的鏈接器,它是CoreData的核心 負(fù)責(zé)鏈接所有的模塊, 包括真實(shí)的存儲(chǔ)文件;
 */
-(id)init{
    if (self=[super init]) {
        
        NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
        if (!coordinator) {
            return nil;
        }
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        
    }
    
    return self;
}

4.set方法:persistentStoreCoordinator

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    
    //CoreData是建立在SQLite之上的,數(shù)據(jù)庫名稱需與.cdatamodel文件同名
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Model.sqlite"];
    
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";
    // 加載sqlite數(shù)據(jù)庫文件
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}

//獲取沙盒Documents目錄中文件的URL
- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

5.set方法:managedObjectModel

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    // xcdataModeld文件編譯后為momd文件,從資源文件加載NSManagedObjectModel
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

6.保存文件

//添加、刪除操作執(zhí)行后,需要調(diào)用該方法保存文件
- (void)saveContext {
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

7.添加數(shù)據(jù)

//第一種插入操作(根據(jù)字典傳遞數(shù)據(jù))
-(BOOL)insertObjectWithEntity:(NSString*)entity parameter:(NSDictionary*)param{

    NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];

    for (NSString*key in param.allKeys) {
        [object setValue:param[key] forKey:key];
    }
    
    return YES;
}

//第二種插入操作(利用Block)
-(BOOL)insertObjectWithEntity:(NSString*)entity completion:(XHInsertBlock)completionHandle{

    NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];
    
    completionHandle(object);
    
    if (object) {
        return YES;
    }else{
        return NO;
    }
}

舉例:

//第一種:
 NSDictionary*dic=@{@"name":@"Kevin"};
[_manager insertObjectWithEntity:@"People" parameter:dic];
[_manager saveContext];
            
//第二種:
[_manager insertObjectWithEntity:@"People" completion:^(NSManagedObject *object) {               
    [object setValue:@"Tom" forKey:@"name"];
}];
[_manager saveContext];

8.查詢數(shù)據(jù)

-(NSArray*)queryWithEntity:(NSString*)entity predicate:(NSPredicate*)predicate sortKey:(NSString*)key ascending:(BOOL)isAscending{
    //創(chuàng)建取回?cái)?shù)據(jù)請(qǐng)求
    NSFetchRequest*request=[[NSFetchRequest alloc]init];
    //設(shè)置檢索的實(shí)體描述
    NSEntityDescription*entityDes=[NSEntityDescription entityForName:entity inManagedObjectContext:_managedObjectContext];
    [request setEntity:entityDes];
    //謂詞,篩選數(shù)據(jù)
    request.predicate=predicate;
    //指定對(duì)檢索結(jié)果的排序方式
     if ( key ){
         //之所以添加判斷,是因?yàn)槿绻鹝ey為nil,NSSortDescriptor則無法初始化,程序會(huì)奔潰
         NSSortDescriptor*sortDestor=[[NSSortDescriptor alloc]initWithKey:key ascending:isAscending];
         [request setSortDescriptors:@[sortDestor]];
    }
    NSError*error=nil;
    //執(zhí)行請(qǐng)求,返回?cái)?shù)組
    NSArray*fetchedResult=[_managedObjectContext executeFetchRequest:request error:&error];
    if (!fetchedResult) {
        NSLog(@"error:%@ ,%@",error,[error userInfo]);
    }
    
    return fetchedResult;
}

舉例:

//查詢sex=@"Man"的people對(duì)象,按照age的升序排列
NSPredicate*predicate=[NSPredicate predicateWithFormat:@"sex=%@",@"Man"];
dataArray=[_manager queryWithEntity:@"People" predicate:predicate sortKey:@"age" ascending:YES];

9.修改數(shù)據(jù)

修改數(shù)據(jù)建立在查詢數(shù)據(jù)的基礎(chǔ)上。查詢數(shù)據(jù)的方法返回的是存儲(chǔ)數(shù)據(jù)的內(nèi)存地址的指針變量。因此,可以通過指針變量對(duì)其指向的內(nèi)存修改數(shù)據(jù)。
舉例:

People*people=(People*)dataArray[0];
people.name=@"Tom";
people.age=18;

10.刪除數(shù)據(jù)

-(BOOL)deleteObject:(NSManagedObject*)object{
    if (object && [object isKindOfClass:[NSManagedObject class]]) {
        [_managedObjectContext deleteObject:object];
        return YES;
    }
    return NO;
}

舉例:

People*people=(People*)dataArray[0];
[_manager deleteObject:people];
[_manager saveContext];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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