CoreData 的簡(jiǎn)單使用

CoreData 的簡(jiǎn)單使用

之前學(xué)了CoreData, 但是幾周沒用就忘記了, 這里整理下筆記, 以便忘記的時(shí)候回來看一下柜与。
本文只記載超詳細(xì)的操作過程哦!! 原理性的東西寫得比較少(旁邊: 明明是自己不會(huì)啊)

保存數(shù)據(jù)的方式

  • 偏好設(shè)置
  • 歸檔
  • sqlite
  • CoreData (基于sqlite的封裝, 數(shù)據(jù)保存到一個(gè)數(shù)據(jù)庫(kù)文件)

什么是CoreData[^1]
[^1]: 這段介紹是從傳智播客那里看到的

Core Data 是 iOS5 之后才出現(xiàn)的一個(gè)框架, 它提供了對(duì)象-關(guān)系映射(ORM)的功能, 即能夠將 OC 對(duì)象轉(zhuǎn)化成數(shù)據(jù), 保存在 SQLite 數(shù)據(jù)庫(kù)文件中, 也能夠將保存在數(shù)據(jù)庫(kù)中的數(shù)據(jù)還原成 OC 對(duì)象。在此數(shù)據(jù)操作期間马昙,我們不需要編寫任何SQL語(yǔ)句榄檬。

CoreData 的簡(jiǎn)單使用操作步驟 (包含3個(gè)部分哦)

第一部分 創(chuàng)建模型

1. 創(chuàng)建模型文件 (相當(dāng)于數(shù)據(jù)庫(kù))

按以下步驟:

  1. command + N (或右鍵 New File...)
  2. Core Data
  3. Data Model
  4. 創(chuàng)建文件 (文件擴(kuò)展名為 .xcdatamodeld), 將文件命名為 Company

2. 添加實(shí)體 (相當(dāng)于表)

按以下步驟:

  1. 點(diǎn)擊 Add Entity (添加實(shí)體)
  2. 將實(shí)體名 Entity 修改為 Employee, 代表公司的員工表
    CoreData01.png
  3. 在右端添加員工表的字段 (name, age, height)
    CoreData02.png

3. 創(chuàng)建實(shí)體類 (相當(dāng)于模型類)

按以下步驟:

  1. command + N (或右鍵 New File...)
  2. Core Data
  3. NSManagedObject subclass
  4. 接著, Data Model 勾選之前的公司模型 (Company), Entity 勾選之前創(chuàng)建的員工實(shí)體 (Employee), 創(chuàng)建員工的實(shí)體類


第二部分 搭建上下文環(huán)境

生成上下文, 關(guān)聯(lián)模型文件生成數(shù)據(jù)庫(kù)

記得導(dǎo)入頭文件 #import <CoreData/CoreData.h> 哦!

開發(fā)步驟總結(jié):

  1. 初始化NSManagedObjectModel對(duì)象, 加載模型文件, 讀取app中的所有實(shí)體信息;
  2. 初始化NSPersistentStoreCoordinator對(duì)象, 添加持久化庫(kù)(這里采取SQLite數(shù)據(jù)庫(kù));
  3. 初始化NSManagedObjectContext對(duì)象, 拿到這個(gè)上下文對(duì)象操作實(shí)體, 進(jìn)行CRUD操作.

實(shí)例:

// 從應(yīng)用程序包中加載模型文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];


// 傳入模型對(duì)象, 初始化NSPersistentStoreCoordinator
// 持久化存儲(chǔ)調(diào)度器
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

// 構(gòu)建SQLite數(shù)據(jù)庫(kù)文件的路徑
// 獲取document目錄
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 數(shù)據(jù)庫(kù)保存的路徑
NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"];

NSError *error = nil;
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:&error];


// 初始化上下文卜范,設(shè)置persistentStoreCoordinator屬性
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = store;


第三部分 實(shí)現(xiàn)增刪改查

添加員工信息 (增)

開發(fā)步驟總結(jié):
Ⅰ 調(diào)用NSEntityDescription類的 insertNewObjectForEntityForName: inManagedObjectContext: 類方法添加新實(shí)體;
Ⅱ 為新實(shí)體設(shè)置屬性;
Ⅲ 調(diào)用NSManagedObjectContext對(duì)象的 save: 方法執(zhí)行保存.

實(shí)例:

// 創(chuàng)建員工
Employee *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:_context];

// 設(shè)置員工屬性
employee.name = @"ryu";
employee.age = @(22);
employee.height = @(17.6);

// 保存
NSError *error;
[_context save:&error];

查詢員工信息 (查)

開發(fā)步驟總結(jié):
Ⅰ 創(chuàng)建NSFetchRequest對(duì)象;
Ⅱ 設(shè)置NSFetchRequest對(duì)象的 entity 屬性, 代表將要查詢的實(shí)體. (該屬性是 NSEntityDescription 類)
也可以將第一、二步過程整合成一步: 直接調(diào)用 NSFetchRequest 類的 fetchRequestWithEntityName: 方法創(chuàng)建 NSFetchRequest 對(duì)象
Ⅲ 設(shè)置NSFetchRequest對(duì)象的屬性, 不同屬性會(huì)有不同的效果

效果 NSFetchRequest對(duì)象的屬性
結(jié)果排序 sortDescriptors
過濾查詢 predicate
分頁(yè)查詢 fetchLimit fetchOffset

Ⅳ 調(diào)用NSManagedObjectContext對(duì)象的 executeFetchRequest: error: 執(zhí)行查詢鹿榜。該查詢方法將會(huì)返回所有符合條件的實(shí)體組成的NSArray集合.

實(shí)例:

查詢?nèi)繂T工信息

// 創(chuàng)建一個(gè)請(qǐng)求對(duì)象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];

NSError *error = nil;
NSArray *emps = [_context executeFetchRequest:request error:&error];
for (Employee *emp in emps) {
    
    NSLog(@"姓名:%@, 年齡:%@, 身高:%@", emp.name, emp.age, emp.height);
}

查詢結(jié)果進(jìn)行排序 (設(shè)置 NSFetchRequest 對(duì)象的 sortDescriptors 屬性)

// 以年齡進(jìn)行升序排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
request.sortDescriptors = @[sort];

過濾查詢 (設(shè)置 NSFetchRequest 對(duì)象的 predicate 屬性)

// 查詢名字叫ryu的信息
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name=%@", @"ryu"];
request.predicate = pre;

// 查詢年齡大于22, 身高大于16.0的員工信息
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age > %@ AND height > %@", @(22), @(16.0)];
request.predicate = pre;

分頁(yè)查詢

// 假定有1000條數(shù)據(jù), 每次查詢5條
// 設(shè)置每次查詢的條數(shù)
request.fetchLimit = 5;
// 設(shè)置分頁(yè)查詢起始頁(yè)數(shù) (查詢的偏移量)
// 從第一頁(yè)開始查詢
request.fetchOffset = 0;

刪除員工信息 (刪)

記住: 要配合上面查詢一起使用哦

開發(fā)步驟總結(jié):

  1. 獲取要?jiǎng)h除的實(shí)體; 用查詢方式找到該實(shí)體哦
  2. 調(diào)用 NSManagedObjectContext 對(duì)象的 - (void)deleteObject:(NSManagedObject *)object; 刪除實(shí)體;
  3. 接著調(diào)用 NSManagedObjectContext 對(duì)象的 save: 方法執(zhí)行保存

刪除和更新的過程超簡(jiǎn)單, 只寫操作過程了, 不附帶實(shí)例(反正估計(jì)沒人看實(shí)例吧, 因?yàn)橘N出來的都是關(guān)鍵代碼片段)

更新員工信息 (改)

記住: 要配合上面查詢一起使用哦

開發(fā)步驟總結(jié):
修改實(shí)體

  1. 獲取要修改的實(shí)體(必須是處于NSManagedObjectContext管理下的實(shí)體); 用查詢方式找到該實(shí)體哦
  2. 修改實(shí)體的屬性;
  3. 接著調(diào)用NSManagedObjectContext對(duì)象的save:方法執(zhí)行保存.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末海雪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舱殿,更是在濱河造成了極大的恐慌奥裸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沪袭,死亡現(xiàn)場(chǎng)離奇詭異湾宙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門侠鳄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗡害,“玉大人,你說我怎么就攤上這事畦攘。” “怎么了十电?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵知押,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鹃骂,道長(zhǎng)台盯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任畏线,我火速辦了婚禮静盅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寝殴。我一直安慰自己蒿叠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布蚣常。 她就那樣靜靜地躺著市咽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抵蚊。 梳的紋絲不亂的頭發(fā)上施绎,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音贞绳,去河邊找鬼谷醉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冈闭,可吹牛的內(nèi)容都是我干的俱尼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼萎攒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼号显!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躺酒,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤押蚤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后羹应,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揽碘,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雳刺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫灶。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掖桦,靈堂內(nèi)的尸體忽然破棺而出本昏,到底是詐尸還是另有隱情,我是刑警寧澤枪汪,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布涌穆,位于F島的核電站,受9級(jí)特大地震影響雀久,放射性物質(zhì)發(fā)生泄漏宿稀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一赖捌、第九天 我趴在偏房一處隱蔽的房頂上張望祝沸。 院中可真熱鬧,春花似錦越庇、人聲如沸罩锐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唯欣。三九已至,卻和暖如春搬味,著一層夾襖步出監(jiān)牢的瞬間境氢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工碰纬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萍聊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓悦析,卻偏偏與公主長(zhǎng)得像寿桨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子强戴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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