CoreData介紹
CoreData是一個模型層的技術,也是一種持久化技術(數據庫),它能將模型對象的狀態(tài)持久化到磁盤里,我們不需要使用SQL語句就能對它進行操作。
創(chuàng)建DataModel
New File -> iOS -> Core Data ->Data Model
名字雖然可以任意取,但最好還是取和自己存儲數據庫名字一樣的名字。這樣可讀性更高些。這個文件就相當于數據庫文件一樣,數據庫文件中可以有多個表,表中可以有各個字段值,這里也可以有多個實體,每個實體有各個鍵值。
創(chuàng)建Entity
- 點擊
.xcdatamodeld文件,在最下面找到Add Entity按鈕,進行實體添加。 - 修改
Entity名字,雙擊一下即可修改名字,或者在xcode右邊的信息欄中也可以修改 - 往實體中添加我們需要的鍵值(相當于數據庫表中的字段)。
創(chuàng)建關聯類
選中.xcdatamodeld文件->xcode菜單欄->Edit->Create NSManagedObject Subclass
選中自己需要關聯的.xcdatamodeld文件名稱,點擊下一步即可。
選中.xcdatamodeld文件中需要關聯的實體對象,點擊下一步然后在選擇存儲目錄即可。
完成后會發(fā)現自動生成了實體名稱對應的類和擴展類(Entity.h/.m和Entity+CoreDataProperties.h/.m)
注意:在Code Generation修改你使用語言是Swift還是Objective-C
CoreData API
- NSManagedObjectContext
- NSManagedObjectModel
- NSPersistentStoreCoordinator
- NSEntityDescription
#import <CoreData/CoreData.h>
NSManagedObjectContext
用來管理.xcdatamodeld中的數據,負責數據和應用庫之間的交互(CRUD,即增刪改查、保存等接口都是用這個對象調用)。
// 不能為 NSManagedObjectContext 實例提供一個線程, iOS9.0 棄用
self.context = [[NSManagedObjectContext alloc] init];
// NSMainQueueConcurrencyType 主線程
// NSPrivateQueueConcurrencyType 另外創(chuàng)建一個后臺線程
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
NSManagedObjectModel
CoreData的模型文件(個人理解:表示一個.xcdatamodeld文件)。
// 1.主動加載指定名稱的.xcdatamodeld資源
//獲取模型路徑
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
//根據模型文件創(chuàng)建模型對象
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// 2.從應用程序包中加載.xcdatamodeld模型文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
NSPersistentStoreCoordinator
持久化存儲庫,CoreData的存儲類型。
- 用來將對象管理部分和持久化部分捆綁在一起,負責相互之間的交流(中介一樣)。
- 用來設置
CoreData存儲類型和存儲路徑。
NSPersistentStoreCoordinator *persistent = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
/*
持久化存儲庫的類型:
NSSQLiteStoreType SQLite數據庫
NSBinaryStoreType 二進制平面文件
NSInMemoryStoreType 內存庫,無法永久保存數據
*/
NSString *sqlPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"CoreDataDemo.sqlite"];
NSError *error = nil;
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlPath] options:nil error:&error];
NSEntityDescription
用來描述實體(Entity),通過CoreData從數據庫中取出的對象,默認情況下都是NSManagedObject對象。
// 注意:不能用 alloc init方式創(chuàng)建
// 創(chuàng)建方式(用于插入數據使用:獲得實體,改變實體各個屬性值,保存后就代表插入)
Student *stutent = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];
CoreData操作
需要通過NSManagedObjectContext對象操作CoreData的增刪改查。
insert
// 1.根據Entity名稱和NSManagedObjectContext獲取一個新的NSManagedObject
Student *stutent = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:self.context];
// 2.根據Entity中的鍵值,一一對應通過setValue:forkey:給NSManagedObject對象賦值
stutent.stuID = @"0001";
stutent.name = @"張三";
stutent.age = 18;
// 3.保存修改
NSError *error = nil;
BOOL result = [self.context save:&error];
if (result) {
NSLog(@"保存成功...");
} else {
NSLog(@"保存失?。?@", error);
}
query
// NSFetchRequest: Core Data中,用于查詢數據的類
// 1.根據Entity名稱創(chuàng)建查詢請求對象
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
// 2.設置查詢過略
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"age <= 60"];
// 3.設置排序器
NSSortDescriptor *ageDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
NSSortDescriptor *nameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
// 排序器,可以指定多個排序器,優(yōu)先順序以數組先后順序
fetchRequest.sortDescriptors = @[nameDescriptor, ageDescriptor];
// 4.執(zhí)行查詢,結果是模型的集合
NSError *error = nil;
NSArray *objs = [self.context executeFetchRequest:fetchRequest error:&error];
if (!error) {
for (Student *student in results) {
NSLog(@"%@: %d", student.name, student.age);
}
} else {
NSLog(@"查詢失?。?@", error);
}
delete
// 1.根據Entity名稱和NSManagedObjectContext通過謂語取出符合的Entity集合
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"age < 50"];
NSArray *objs = [self.context executeFetchRequest:fetchRequest error:nil];
// 2.刪除集合內的Entity
for (Student *student in objs) {
[self.context deleteObject:student];
}
// 3.保存修改
NSError *error = nil;
BOOL result = [self.context save:&error];
if (result) {
NSLog(@"保存成功...");
} else {
NSLog(@"保存失?。?@", error);
}
update
// 1.根據Entity名稱和NSManagedObjectContext通過謂語取出符合的Entity集合
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"age = 18"];
NSArray *objs = [self.context executeFetchRequest:fetchRequest error:nil];
// 2.修改Entity
Student *student = [objs lastObject];
student.age = 25;
// 3.保存修改
NSError *error = nil;
BOOL result = [self.context save:&error];
if (result) {
NSLog(@"保存成功...");
} else {
NSLog(@"保存失?。?@", error);
}




