CoreData數(shù)據(jù)庫簡介
CoreData
是一個(gè)功能強(qiáng)大的數(shù)據(jù)持久化技術(shù),位于SQLite數(shù)據(jù)庫之上,不需要使用SQL語句就能對它進(jìn)行操作冰肴。不過在性能方面弱于直接使用SQLite數(shù)據(jù)庫仅偎。
CoreData與SQLite進(jìn)行對比
SQLite
1.基于C接口,需要SQL語句近刘,代碼繁瑣擒贸。
2.處理大量數(shù)據(jù)時(shí),表關(guān)系更直觀觉渴。
3.在OC中不是可視化介劫,不易理解。
CoreData
1.可視化案淋,且具有undo/redo能力
2.可以實(shí)現(xiàn)多種文件格式:
* NSSQLiteStoreType
* NSBinaryStoreType
* NSInMemoryStoreType
* NSXMLStoreType
3.蘋果官方API支持座韵,與iOS結(jié)合更緊密
使用CoreData數(shù)據(jù)庫
下面我們就動(dòng)手來創(chuàng)建一個(gè)帶有CoreData數(shù)據(jù)庫的工程
1.創(chuàng)建工程
我們創(chuàng)建工程的時(shí)候勾選上Use Core Data,工程會自動(dòng)創(chuàng)建一個(gè)和項(xiàng)目同名的.xcdatamodeld文件就是模型文件踢京。
2.創(chuàng)建實(shí)體
點(diǎn)開模型文件誉碴,點(diǎn)擊下方的Add Entity按鈕,可以添加一個(gè)實(shí)體瓣距,我們起名為Person黔帕。然后在Person中的Attributes面板(屬性)中添加兩個(gè)屬性,name和age蹈丸。這樣我們就創(chuàng)建一個(gè)實(shí)體蹬屹。
3.創(chuàng)建模型
點(diǎn)擊Xcode菜單欄中的Editor再點(diǎn)擊Create NSManagedObject SubClass
系統(tǒng)就會自動(dòng)幫你創(chuàng)建出4個(gè)文件
這樣我們就可以在項(xiàng)目中使用CoreData數(shù)據(jù)庫了侣背。
CoreData的結(jié)構(gòu)
-
NSManagedObjectContext
對象管理上下文,處理數(shù)據(jù)與應(yīng)用的交互 -
NSManagedObjectModel
被管理的數(shù)據(jù)模型慨默,在程序中使用的模型 -
NSPersistentStoreCoordinator
持久化存儲協(xié)調(diào)器贩耐,添加數(shù)據(jù)庫,設(shè)置數(shù)據(jù)存儲的名字厦取,位置潮太,存儲方式 -
NSManagedObject
被管理的數(shù)據(jù)記錄 -
NSFetchRequest
數(shù)據(jù)操作請求 -
NSEntityDescription
表格實(shí)體結(jié)構(gòu)
下圖能很好的表示出CoreData中的結(jié)構(gòu)
CoreData的增刪改查
寫入數(shù)據(jù)
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.persistentContainer.viewContext;
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
p.name = @"wang";
p.age = 12;
NSError *error = nil;
if ([self.context save:&error]) {
NSLog(@"%@",error.userInfo);
} else {
NSLog(@"添加成功");
}
刪除數(shù)據(jù)
NSError *error = nil;
NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
if (result && result.finalResult.count > 0) {
//刪除第一條數(shù)據(jù)
Person *p = (Person *)result.finalResult[0];
NSError *delError = nil;
[self.context deleteObject:p];
if ([self.context save:&delError]) {
NSLog(@"刪除一條數(shù)據(jù)失敗");
} else {
NSLog(@"成功刪除第一條數(shù)據(jù)");
}
}
}];
[context executeRequest:request error:&error];
查詢數(shù)據(jù)
//使用type是NSPrivateQueueConcurrencyType的context,使context具有開啟新線程的能力虾攻,這樣執(zhí)行大量查詢操作的時(shí)候就不會阻塞主線程了铡买。
NSManagedObjectContext *backContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[backContext setPersistentStoreCoordinator:self.context.persistentStoreCoordinator];
//異步查詢
NSAsynchronousFetchRequest *request = [[NSAsynchronousFetchRequest alloc]initWithFetchRequest:[Person fetchRequest] completionBlock:^(NSAsynchronousFetchResult * _Nonnull result) {
if (result) {
NSLog(@"存在%zd條數(shù)據(jù),線程:%@",result.finalResult.count,[NSThread currentThread]);
for (Person *p in result.finalResult) {
NSLog(@"name:%@,age:%d",p.name,p.age);
}
}
}];
NSError *error = nil;
[backContext executeRequest:request error:&error];
修改數(shù)據(jù)和查詢類似這里就不寫了。
Demo下載:CoreData Demo