iOS coredata 因?qū)W習曲線陡峭焕阿,所以用的人不多。
為啥陡峭夯到?
因為coredata不走sql尋常路枣申,自己全新搞了一套售葡,我們忽然發(fā)現(xiàn)之前學的那些sql小技巧似乎都用不上了。
然后網(wǎng)上的教程都是東一坨西一坨的忠藤,看起來和盲人象差不多挟伙,看英文原版教程吧,發(fā)現(xiàn)自己的英文山寨四級水平大概只適合看hello world模孩,只恨當年沒有好好苦練英文尖阔。再加上iOS操作系統(tǒng)的版本不斷升級,前人積累的經(jīng)驗顯得更加碎片榨咐,給本來就一頭霧水的同學平添更多難度介却。
因此特編寫本文,僅適合從來沒有接觸過coredata块茁,但是又想上手一試的同學齿坷,幫助大家在5分鐘之內(nèi)了解coredata的基本用法;
真經(jīng)一句話数焊,假言萬卷書永淌。
開始表演~
一、非常重要的前提
(1)僅適合iOS 10+佩耳,如果想看老版本下的兼容處理遂蛀,本文不適合;
(2)僅適合從來沒有接觸過coredata蚕愤,但是又想上手一試的同學答恶,已經(jīng)了解過的同學就請直接跳過吧,不要浪費生命萍诱;
(3)本文代碼在xcode 12.4悬嗓,iOS 10+ 環(huán)境測試通過;
(4)本文編寫時間為2021年3月 裕坊,如果你看到本文的時間與編寫時間相距過于久遠包竹,建議也不要看了,因為隨著技術(shù)的發(fā)展籍凝,這些文字對你來說可能已經(jīng)是毒藥了周瞎;
二、如何開始
在iOS中使用coredata的基本思路就是:
建立數(shù)據(jù)表模型-->創(chuàng)建對應(yīng)的實體類-->針對實體類增刪改查
2.1饵蒂、建立數(shù)據(jù)表模型
用xcode提供的可視化工具創(chuàng)建數(shù)據(jù)表字段声诸;
如下圖所示:
其中,
位置1
位置1的名字為:PackageModel.xcdatamodeld
可以把這個文件看作mysql中的一個schema(sqlserver里的一個數(shù)據(jù)庫)退盯,或者sqlite里的一個數(shù)據(jù)庫文件彼乌;
這個文件可以通過xcode>file>new>file>Core Data>Data Model 菜單操作來建立泻肯;
如下圖:
位置2
就看做數(shù)據(jù)表結(jié)構(gòu)定義吧
在這里定義了2張數(shù)據(jù)表
位置3
指定數(shù)據(jù)表的字段名稱和字段數(shù)據(jù)類型
位置4
表和表之間的主外鍵關(guān)聯(lián),比如1:1的就是To One,1:* 的就是To many
2.2慰照、創(chuàng)建實體類文件
現(xiàn)在表定義好了灶挟,要開始定義和這些表結(jié)構(gòu)對應(yīng)的實體類文件了。
實體類文件可以自動生成毒租;
方法如下:
(1)打開PackageModel.xcdatamodeld這個倒霉的數(shù)據(jù)庫文件稚铣,
然后在打開的界面下通過xcode菜單來操作:
xcode > Editor > Create NSManagedObject Subclass,xcode會幫你在你自己指定的位置創(chuàng)建好對應(yīng)的實體類文件墅垮;
創(chuàng)建好的實體類的樣子如下:
2.3惕医、開始編寫代碼,愉快的CRUD吧~
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface AppManager : NSObject
@property(nonatomic) NSPersistentContainer *persistentContainer;
@end
......下面是.m文件里的內(nèi)容
- (void)configDbModel {
self.persistentContainer = [NSPersistentContainer persistentContainerWithName:@"PackageModel"];
[self.persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription * _Nonnull description, NSError * _Nullable error) {
NSLog(@"error:%@",error.localizedDescription);
//創(chuàng)建一個條新的空白記錄算色,然后寫點東西
PackageMO *obj = [NSEntityDescription insertNewObjectForEntityForName:@"Package" inManagedObjectContext:self.persistentContainer.viewContext];
obj.packageId = 100;
obj.packageName = @"我是一頭豬";
//保存到數(shù)據(jù)庫里
NSManagedObjectContext *context = self.persistentContainer.viewContext;
NSError *errorSave = nil;
[context save:&errorSave];
//再讀出來
NSError *errorFetch = nil;
NSFetchRequest *request = [PackageMO fetchRequest];
NSArray *array = [context executeFetchRequest:request
error:&errorFetch];
for (PackageMO *p in array) {
NSLog(@"%ld,%@",(long)p.packageId,p.packageName);
}
}];
}
//日志:
2021-03-05 01:06:31.297519+0800 MarketPromotion[5472:1638998] 100,我是一頭豬
代碼中曹锨,NSPersistentContainer 的實例是核心關(guān)鍵,就當作是前文中所述數(shù)據(jù)庫的肉身管理器吧剃允。
NSManagedObjectContext,也就是上面的代碼中的self.persistentContainer.viewContext齐鲤,就當作是NSPersistentContainer這個數(shù)據(jù)庫肉身管理器的操作API吧斥废。
NSFetchRequest 就當作sql里select語句的變身好了。
三给郊、后記
coredata博大精深牡肉,這就是起了頭,要想用的好淆九,還是得多找更多高級的文檔看看统锤。我們就此別過,緣聚緣散炭庙,愿君碼路之上一碼平川~