Coredata第一課 認識coredata,coredata第一課認識
問題
在iOS/Mac中我們有許多方式去持久化儲存資料:NSUserDefault、Key chain、C語言檔案介面、NSFileHandle、基礎架構中的write方法、歸檔等等。在實際應用中,我們經常需要將這些資料按一定格式轉換為對象,並且進行一定的篩選等操作然後再使用,顯得不是很方便。Apple給我們提供了Core Data架構,可以直接按對象的方式操作資料,讓這些變得非常簡單。
簡介
CoreData中有這麼幾個常用的元素:
名稱 |
作用 |
NSManagedObjectModel |
物件模型,指定所用對象檔案 |
NSPersistentStoreCoordinator |
持久化儲存協調器,設定對象的儲存方式和資料存放位置 |
NSManagedObjectContext |
對象管理上下文,負責資料的實際操作(重要) |
NSEntityDescriptor |
實體描述符,描述一個實體,可以用來產生實體對應的對象 |
NSManagedObject |
對象 |
NSFetchRequest |
物件查詢,相當於SQL的Select語句 |
使用步驟
在這篇文章中我們使用最簡單的方式,也就是在建立項目的時候,勾選“Core Data”選項。Xcode會自動替我們在“AppDelegate”中加入建立“NSManagedObjectModel”、“NSPersistentStoreCoordinate”和“NSManagedObjectContext”等對象,方便後面的使用。
1 . 建立“NSManagedObjectModel”對象。
- (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } //CoreData模型檔案的路徑,注意編譯好的模型檔案名稱副檔名為"momd" NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData01" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel;}
2 . 建立“NSPersistentStoreCoordinator”對象。
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } //指定需要持久化的模型對象 _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; //持久化的隱藏檔 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData01.sqlite"]; NSError *error = nil; //設定儲存格式為SQLite if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { } return _persistentStoreCoordinator;}
3 . 建立上下文
- (NSManagedObjectContext *)managedObjectContext { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (!coordinator) { return nil; } //建立管理上下文 _managedObjectContext = [[NSManagedObjectContext alloc] init]; //關聯上下文與儲存物件 [_managedObjectContext setPersistentStoreCoordinator:coordinator]; return _managedObjectContext;}
4 . 設定模型檔案,添加實體(Entity)
點擊“CoreData01.xcdatamodelId”檔案,然後添加一個實體“Book”,並增加幾個屬性。Core Data中的實體類似於資料庫的表定義,規定了不同欄位(屬性)的名字和類型。
5 . 建立模型對象的類, "Editor > Create NSManagedobject Subclass"。
6 . 選擇使用標量定義數實值型別的屬性(預設使用NSNumber類型定義int、float等類型的屬性)。
7 . Xcode自動建立於實體同名的類,並且繼承自“NSManagedObject”。
8 . 建立對象並儲存。
//擷取AppDelegate中建立的內容物件AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;NSManagedObjectContext *context = appDelegate.managedObjectContext;//擷取實體描述符NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];//建立對象Book *book = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:context];//設定對象的屬性book.title = @"紅樓夢";//儲存資料[context save:nil];
9 . 以後可以通過"NSFetchRequest"從檔案中擷取資料。
AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;NSManagedObjectContext *context = appDelegate.managedObjectContext;//建立請求對象,用於擷取實體Book所對應的全部資料,可以通過給NSFetchRequest設定predicate和sortDescriptors對結果進行篩選和排序。NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];NSArray *result = [context executeFetchRequest:fetchRequest error:nil];NSLog(@"%@", result);
總結
Core Data的簡單使用還是很方便的,我們只需要關注資料內容和處理邏輯,而不需要考慮過多的儲存操作。但是它需要使用很多貌似沒有直接關聯的代碼,使得大家感覺非常複雜。
本文檔由長沙戴維營教育整理。