學(xué)會用CoreData坛梁,發(fā)現(xiàn)真的好用

CoreData

CoreData是蘋果系統(tǒng)提供的一套數(shù)據(jù)本地存儲API而姐,提供了一個(gè)強(qiáng)大的近自動化的存儲方式,我們不用關(guān)心內(nèi)部怎么存儲划咐,怎么刪除拴念,怎么查找,只需要提供存儲路徑褐缠,存儲方式政鼠,執(zhí)行增刪改查的命令就行了,那CoreData是怎么做到這些的呢队魏?

API提供了幾個(gè)相關(guān)類公般,也就是CoreData的核心框架Core Data Stack,有NSManagedObjectContext胡桨、NSPersistentStoreCoordinate和NSManagedObjectModel:

NSManagedObjectContext 是CoreData存儲管理上下文官帘,負(fù)責(zé)整個(gè)app的數(shù)據(jù)操作;
NSPersistentStoreCoordinate負(fù)責(zé)NSManagedObjectModel的存儲昧谊,定義了存儲數(shù)據(jù)的方式刽虹,路徑及存儲策略;
NSManagedObjectModel被管理的對象模型呢诬,就是我們創(chuàng)建coreData生成的.xcdatamodel文件涌哲;

下面通過這三個(gè)重要類的定義胖缤,我們詳細(xì)的看看其作用,首先_managedObjectModel定義了app內(nèi)要操作的coredata文件是yingshibao.momd,其實(shí)就是.xcdatamodel文件阀圾,_persistentStoreCoordinator定義了存儲的文件類型是NSSQLiteStoreType數(shù)據(jù)庫草姻,其次指定了存儲的model是_managedObjectModel,這就把a(bǔ)pp內(nèi)和沙盒聯(lián)系起來了稍刀,最后一個(gè)就是NSManagedObjectContext,對數(shù)據(jù)的操作就通過傳入的NSManagedObjectContext參數(shù)來確定操縱的是哪一個(gè)存儲上下文

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"yingshibao.sqlite"];
    NSError *error = nil;
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"yingshibao" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: _managedObjectModel];
    
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : [NSNumber numberWithBool:YES],
                              NSInferMappingModelAutomaticallyOption : [NSNumber numberWithBool:YES]};
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSAssert(0, @"數(shù)據(jù)庫表結(jié)構(gòu)有變化敞曹,刪除重新測試");
    }

    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

下方圖中解釋了這三者之間的工作關(guān)系


20160711190941786.jpeg

通常一個(gè)項(xiàng)目里我們只使用一個(gè)數(shù)據(jù)庫就搞定本地持久化了账月, 而實(shí)際項(xiàng)目中,有時(shí)候需要將不同業(yè)務(wù)的數(shù)據(jù)存儲在不同的沙盒位置澳迫,這時(shí)候我們可以通過創(chuàng)建多個(gè)context上下文局齿,去對應(yīng)多個(gè)沙盒位置,但是用同一個(gè)NSPersistentStoreCoordinator就可以橄登,因?yàn)镹SPersistentStoreCoordinator可以添加多個(gè)NSPersistentStore來負(fù)責(zé)NSManagedObjectModel的存儲抓歼,

//每執(zhí)行一次這個(gè)代碼就為_persistentStoreCoordinator添加一個(gè)NSPersistentStore,每個(gè)NSPersistentStore對應(yīng)一種存儲(一個(gè)存儲路徑和一種存儲文件類型)
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]
20160711191002361.jpeg

使用

增:每一個(gè)data model對應(yīng)一個(gè)NSEntityDescription對象拢锹,NSEntityDescription對象包含了Entity所擁有的屬性谣妻,關(guān)系等信息,我們可以通過NSEntityDescription生成相應(yīng)的NSManagedObject的實(shí)體

Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
student.name = @"李四";
[context save];

查:NSFetchRequest負(fù)責(zé)查詢卒稳,可以定義查詢條件和結(jié)果排序規(guī)則

 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@","李四"];
 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
 [request setPredicate:predicate];
 [request setSortDescriptors:@[sort]];
 NSArray *result = [context executeFetchRequest:request error:nil];

刪: 刪的前提是查找蹋半,繼查找之后

for (Student *stu in result) {
        [context deleteObject:stu];
    }
//別忘記保存
[context save:nil];

改: 改的前提也是查找,繼查找之后

stu.name = @"張三";
//別忘記保存
[context save:nil];

另外一個(gè)簡便的獲取展示的列表數(shù)據(jù)的類NSFetchedResultsController充坑,初始化的過程就是查詢的過程减江,通過這個(gè)類可以直接訪問查詢結(jié)果,包括列表分區(qū)展示等

NSFetchedResultsController *vc = [[NSFetchedResultsController alloc]initWithFetchRequest:request   managedObjectContext:context sectionNameKeyPath:@"以哪個(gè)字段分區(qū)展示如 age" cacheName:nil];
//獲取分區(qū)信息
vc.sections
NSFetchedResultsSectionInfo *sectionInfo = vc.sections[0];
sectionInfo.name
//數(shù)據(jù)
vc.fetchedObjects
[vc objectAtIndexPath:indexPath];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捻爷,一起剝皮案震驚了整個(gè)濱河市辈灼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌也榄,老刑警劉巖巡莹,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異手蝎,居然都是意外死亡榕莺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門棵介,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钉鸯,“玉大人,你說我怎么就攤上這事邮辽∵氲瘢” “怎么了贸营?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長岩睁。 經(jīng)常有香客問我钞脂,道長,這世上最難降的妖魔是什么捕儒? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任冰啃,我火速辦了婚禮,結(jié)果婚禮上刘莹,老公的妹妹穿的比我還像新娘阎毅。我一直安慰自己,他們只是感情好点弯,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布扇调。 她就那樣靜靜地躺著,像睡著了一般抢肛。 火紅的嫁衣襯著肌膚如雪狼钮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天捡絮,我揣著相機(jī)與錄音熬芜,去河邊找鬼。 笑死福稳,一個(gè)胖子當(dāng)著我的面吹牛猛蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灵寺,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼曼库,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了略板?” 一聲冷哼從身側(cè)響起毁枯,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叮称,沒想到半個(gè)月后种玛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓤檐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年赂韵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挠蛉。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祭示,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谴古,到底是詐尸還是另有隱情质涛,我是刑警寧澤稠歉,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站汇陆,受9級特大地震影響怒炸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毡代,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一阅羹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧教寂,春花似錦灯蝴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕肩。三九已至因妇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猿诸,已是汗流浹背婚被。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梳虽,地道東北人址芯。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像窜觉,于是被迫代替她去往敵國和親谷炸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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