CoreData的使用

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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容