CoreData基本操作封裝

本文僅對(duì)CoreData的增虚吟、刪邀摆、該羔挡、查操作做簡(jiǎn)單封裝洁奈。之所以說是簡(jiǎn)單封裝,是因?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)系作者
  • 序言:七十年代末桃纯,一起剝皮案震驚了整個(gè)濱河市酷誓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌态坦,老刑警劉巖盐数,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異伞梯,居然都是意外死亡玫氢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門谜诫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漾峡,“玉大人,你說我怎么就攤上這事喻旷∩荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵且预,是天一觀的道長(zhǎng)槽袄。 經(jīng)常有香客問我,道長(zhǎng)锋谐,這世上最難降的妖魔是什么遍尺? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮涮拗,結(jié)果婚禮上狮鸭,老公的妹妹穿的比我還像新娘合搅。我一直安慰自己,他們只是感情好歧蕉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布贼急。 她就那樣靜靜地躺著,像睡著了一般修档。 火紅的嫁衣襯著肌膚如雪咒锻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天催跪,我揣著相機(jī)與錄音锁蠕,去河邊找鬼。 笑死懊蒸,一個(gè)胖子當(dāng)著我的面吹牛荣倾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骑丸,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舌仍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了通危?” 一聲冷哼從身側(cè)響起铸豁,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菊碟,沒想到半個(gè)月后节芥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆害,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年头镊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄幕。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拧晕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梅垄,到底是詐尸還是另有隱情厂捞,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布队丝,位于F島的核電站靡馁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏机久。R本人自食惡果不足惜臭墨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膘盖。 院中可真熱鬧胧弛,春花似錦尤误、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至红竭,卻和暖如春尤勋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茵宪。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工最冰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人稀火。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓暖哨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親凰狞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篇裁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容