一、設(shè)計(jì)實(shí)體模型(打開FKModel.xcdatamodeld)
1.對(duì)象模型的三種對(duì)象
(1)實(shí)體:最核心的對(duì)象,必須是NSManagedObject類或其子類。
(2)抓取請(qǐng)求:NSFetchRequest對(duì)象,Xcode允許在圖形界面上抓取請(qǐng)求對(duì)象,但我們通 ? ? ?常會(huì)在代碼中創(chuàng)建NSFetchRequest對(duì)象。
(3)配置:一般不需要自己天劍配置對(duì)象,添加實(shí)體后會(huì)自動(dòng)添加默認(rèn)配置。
2.實(shí)體的三種屬性
(1)屬性(Attribute):相當(dāng)于實(shí)體對(duì)象的實(shí)例變量,記錄實(shí)體狀態(tài)。
(2)關(guān)聯(lián)關(guān)系(Relationships): 1:1、1:N、N:N
(3)抓取屬性(Fetched Properties):關(guān)聯(lián)關(guān)系可選方法,允許在獲取關(guān)聯(lián)實(shí)體時(shí)執(zhí)行某個(gè)過(guò)濾條件。
3.添加完實(shí)體切換實(shí)體對(duì)象圖可以看得很明了
4.最后一步創(chuàng)建。
二、使用Core Data實(shí)現(xiàn)數(shù)據(jù)的增、刪、改、查
1.添加實(shí)體
(1)首先調(diào)用NSEntityDescription的insertNewObjectForEntityForName:inManagedObjectContext:類方法來(lái)添加新實(shí)體第一個(gè)參數(shù)設(shè)置實(shí)體名,第二個(gè)參數(shù)為NSManagedObjectContext對(duì)象。
(2)為新實(shí)體設(shè)置屬性
(3)調(diào)用NSManagedObjectContext對(duì)象的save:方法執(zhí)行保存
//控制Core Data 在托管對(duì)象上下文中創(chuàng)建一個(gè)新實(shí)體
FKEntity* event=[[NSEntityDescription]insertNewObjectForEntityForName:@"FKEntity" inManagedObjectContext:self.appDelegate.managedObjectContext];
//為新實(shí)體設(shè)置屬性
...
//定義一個(gè)NSError對(duì)象,用于接收錯(cuò)誤信息
NSError *error;
//設(shè)置完實(shí)體屬性后調(diào)用托管上下文的save:方法將實(shí)體寫入數(shù)據(jù)庫(kù),
if([self.appDelegate.managedObjectContext save:&error]){
...
}
else{
NSLog(@"保存實(shí)體出錯(cuò):%@,%@",error,[error userInfo]);
}
2.刪除實(shí)體
(1)獲取刪除實(shí)體
(2)調(diào)用NSManagedObjectContext對(duì)象的deleteObject:方法刪除實(shí)體。
(3)調(diào)用NSManagedObjectContext對(duì)象的save:方法保存
//獲取將要?jiǎng)h除的實(shí)體
FKEvent *deleteEvent=....
//從托管對(duì)象上下文中刪除指定對(duì)象
[self.appDeletegate.managedObjectContext deleteObject:deleteEvent];
//定義一個(gè)NSError對(duì)象,用于接收錯(cuò)誤消息
NSError *error;
//保存刪除操作,如果出現(xiàn)錯(cuò)誤,顯示錯(cuò)誤信息
if(![self.appDelegate.manageObjectContext save:&error])
{
NSLog(@"刪除實(shí)體出錯(cuò):%@,%@",error,[error userInfo]);
}
3.修改實(shí)體
(1)獲取修改實(shí)體
(2)修改實(shí)體
(3)保存
//獲取將要修改的實(shí)體
FKEvent *updateEvent=....
//修改實(shí)體屬性
...
//定義一個(gè)NSError對(duì)象,用于接收錯(cuò)誤消息
NSError *error;
//保存修改操作,如果出現(xiàn)錯(cuò)誤,顯示錯(cuò)誤信息
if(![self.appDelegate.manageObjectContext save:&error])
{
NSLog(@"修改實(shí)體出錯(cuò):%@,%@",error,[error userInfo]);
}
4.查詢實(shí)體
(1)創(chuàng)建NSFetchRequest對(duì)象
(2)通過(guò)NSEntityDescroption對(duì)象設(shè)置NSFetchRequest對(duì)象將要抓取的實(shí)體
(3)如果需要篩選則通過(guò)NSPredicate對(duì)象設(shè)置篩選條件,如需要排序還需要為NSFetchRequest添加多個(gè)NSSortDescriptor對(duì)象
//創(chuàng)建抓取數(shù)據(jù)的請(qǐng)求對(duì)象
NSFetchRequest *request=[[NSFetchRequest alloc]init];
//設(shè)置要抓取哪種類型的實(shí)體
NSEntityDescription *entity=[NSEntityDescription entityForName:@"FKEvent" ?inManagedObjectContext:self.appDelegate.managedObjectContext];
//設(shè)置抓取實(shí)體
[request setEntity:entity];
//設(shè)置抓取條件
request.predicate=[NSPredicate predicateWithFormat...];
NSError *error=nil;
//執(zhí)行抓取數(shù)據(jù)的請(qǐng)求,返回符合條件的數(shù)據(jù)
NSArray *array=[[self.appDelegate.managedObjectContext executeFetchRequest:request error:&error]mutableCopy];
三、實(shí)例(自動(dòng)初始化)
1.新建一個(gè)Empty Application項(xiàng)目 并勾選Use Core Data(默認(rèn)勾選)
2.添加CoreData.framework框架
3.添加一個(gè)空的.xcdatamodeld實(shí)體設(shè)計(jì)文件
4.在appDelegate中為CoreData的三個(gè)API定義屬性并提供了方法執(zhí)行初始化,在該方法中調(diào)用托管上下文的save:方法
5.添加實(shí)體與實(shí)體的關(guān)聯(lián)如圖
6.設(shè)置author與books的1:N雙向關(guān)聯(lián)
7.Delete Rule屬性:
(1)NO Action:主體被刪除時(shí),關(guān)聯(lián)的目標(biāo)實(shí)體沒有任何改變。
(2)Nullify:主體被刪除時(shí),關(guān)聯(lián)的目標(biāo)實(shí)體外鍵值被設(shè)為null。
(3)Cascade:主體被刪除時(shí),關(guān)聯(lián)的目標(biāo)實(shí)體也被級(jí)聯(lián)刪除。
(4)Deny:主體試圖被刪除時(shí),如果關(guān)聯(lián)的目標(biāo)實(shí)體依然存在,刪除失敗——必須先刪除目標(biāo)實(shí)體然后刪除主體。