CoreData基礎用法

一、簡單介紹
Core Data是iOS5之后才出現(xiàn)的一個框架,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠將保存在數(shù)據(jù)庫中的數(shù)據(jù)還原成OC對象。在此數(shù)據(jù)操作期間,我們不需要編寫任何SQL語句。
對象-關系映射(ORM)

左邊是關系模型,即數(shù)據(jù)庫,數(shù)據(jù)庫里面有張person表,person表里面有id、name、age三個字段,而且有2條記錄;
右邊是對象模型,可以看到,有2個OC對象;
利用Core Data框架,我們就可以輕松地將數(shù)據(jù)庫里面的2條記錄轉換成2個OC對象,也可以輕松地將2個OC對象保存到數(shù)據(jù)庫中,變成2條表記錄,而且不用寫一條SQL語句。
二、創(chuàng)建模型
上文已經(jīng)介紹過,CoreData可以將一個OC對象轉化成**關系模型 **(一個表格)存儲在SQLite中。那么,現(xiàn)在我們就需要創(chuàng)建一個存儲數(shù)據(jù)的Model類。具體操作如下:
1.創(chuàng)建后綴為.xcdatamodeld的模型文件
command+n:出現(xiàn)如下窗口,點擊next


彈出一個窗口,“Save as:”后面修改文件名,點擊Creat,出現(xiàn)如下界面:


點擊“Add Entity”添加實體,出現(xiàn)綠色框中的“Entity”,雙擊“Entity”,可以更改實體的名字。比如,改為“People”。機智的騷年,你是不是想到了什么?是的,其實Entity就是一個NSObject。既然如此,我們就可以往這個叫做“Peolpe”的Entity中添加一些屬性。點擊Attributes下的“+”,如下圖:


有時由于項目需求,需要在Entity(例如“People”)中添加另一個Entity(例如“Car”)作為它的屬性,而Car也有一個“People”屬性。那么,這兩個Entity是相互關聯(lián)的。我們需要給它們添加關聯(lián):
第一步:創(chuàng)建一個名為“Car”的Entity。既然是添加關聯(lián),我們當然要在Relationships下操作了。點擊Relationships下的“+”添加需要關聯(lián)的Entity( "People" )?!癛elationships”:自己定義(所要添加的屬性名); “Destination”:要關聯(lián)的Entity("People") ; “Inverse”:這個暫時不用管它(這個時候還無法操作)。

第二步:既然是相互關聯(lián),我們當然也要在People的Relationships下添加一個關聯(lián)。與第一步類似:“Relationships”:自己定義(所要添加的屬性名); “Destination”:要關聯(lián)的Entity("Car") ; “Inverse”:點擊會有一個選擇框,我這里的選項是“ower”,選擇它。


2.創(chuàng)建NSManagedObject子類
模型文件創(chuàng)建好后,接下來就要根據(jù)這個模型文件創(chuàng)建處相應的Model類,具體操作如下:點擊 .xcdatamodeld文件--->Editor--->Creat NSManagedObject Subclass


彈出一個窗口,打上勾,點擊Creat,又彈出一個窗口,全鉤上,Creat。最后,生成八個文件,如下圖


三、數(shù)據(jù)操作
前文已經(jīng)提過因為CoreData是蘋果公司封裝的數(shù)據(jù)持久化框架,所以CoreData數(shù)據(jù)持久化的操作,不需要編寫SQLite語句,而是要用到一些相關的類。比如:NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContext等等。
1.CoreData構成的類介紹
(1)NSManagedObjectContext: 被管理者對象上下文, 相當于一個臨時數(shù)據(jù)庫, 我們存儲或者查詢都是通過這個對象來的;
(2)NSManagedObjectModel: 被管理對象模型,可以簡單的理解為可視化建模文件(.xcdatamodeld文件), 我們在可視化建模中是Entity自動生成model 方便讓文件存儲助理來進行管理;
(3)NSPersistentStoreCoordinator: 文件存儲助理,相當于數(shù)據(jù)庫的鏈接器,它是CoreData的核心 負責鏈接所有的模塊, 包括真實的存儲文件;
(4)NSManagedObject: 被管理的數(shù)據(jù)記錄,相當于數(shù)據(jù)庫中的表格記錄;
(5)NSFetchRequest: 獲取數(shù)據(jù)的請求,相當于SQL語句;
(6)NSEntityDescription: 實體結構,相當于表結構;
2.CoreData核心類初始化
CoreData核心類就是NSManagedObjectModel、NSPersistentStoreCoordinator、NSManagedObjectContext。CoreData的一系列操作都離不開這三個類,也正是因為它們這么重要,所以我們在創(chuàng)建工程時只要勾上CoreData選項,Xcode就會在AppDelegate.m文件中自動生成這三個類的初始化代碼。

這些代碼你可以寫不出來,但是一定要清楚它們的作用,下面將對這些代碼做一些介紹注釋:

//獲取沙盒Document目錄路徑
- (NSURL*)applicationDocumentsDirectory {
return[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];
}
//被管理的對象模型
- (NSManagedObjectModel*)managedObjectModel {
      if(_managedObjectModel!=nil) {
      return_managedObjectModel;
      }
     //這里的@"*Model*"需要與.xcdatamodeld文件的名字一樣;.xcdatamodeld編譯后為.momd或.mom文件
     NSURL*modelURL = [[NSBundle mainBundle]URLForResource:@"*Model*"withExtension:@"momd"];
     _managedObjectModel= [[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];
     return_managedObjectModel;
}
//持久化存儲助理:相當于數(shù)據(jù)庫的連接器
- (NSPersistentStoreCoordinator*)persistentStoreCoordinator {
       if(_persistentStoreCoordinator!=nil) {
       return_persistentStoreCoordinator;
       }
       _persistentStoreCoordinator= [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
       //CoreData是建立在SQLite之上的,數(shù)據(jù)庫名稱需與.cdatamodel文件同名
       NSURL*storeURL = [[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"Model.sqlite"];
       NSError*error =nil;
       NSString*failureReason =@"There was an error creating or loading the application's saved data.";
       if(!     [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSMutableDictionary*dict = [NSMutableDictionary dictionary];
       dict[NSLocalizedDescriptionKey] =@"Failed to initialize the application's saved data";
       dict[NSLocalizedFailureReasonErrorKey] = failureReason;
       dict[NSUnderlyingErrorKey] = error;
       error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN"code:9999userInfo:dict];
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
       abort();
    }
    return_persistentStoreCoordinator;
}
//被管理的上下文:操作實際內容
- (NSManagedObjectContext*)managedObjectContext {
      if(_managedObjectContext!=nil) {
          return_managedObjectContext;
      }
      NSPersistentStoreCoordinator*coordinator = [self persistentStoreCoordinator];
      if(!coordinator) {
             return nil;
      }
      _managedObjectContext= [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
      [_managedObjectContext setPersistentStoreCoordinator:coordinator];
      return_managedObjectContext;
}
//保存數(shù)據(jù)
- (void)saveContext {
NSManagedObjectContext*managedObjectContext =self.managedObjectContext;
if(managedObjectContext !=nil) {
NSError*error =nil;
if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}

3.增、刪、改、查操作
以下操作均是利用Xcode自動在AppDelegate初始化CoreData的核心對象,所以首先需要初始化一個AppDelegate對象

AppDelegate*app=[[AppDelegate alloc]init];

插入數(shù)據(jù)

NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:app.managedObjectContext];
//第一種方式
[object setValue:@"Kevin" forKey:@"name"];
//第二種方式
(People*)people=object;
object.name=@"Kevin";
.......
//插入操作結束后記得保存
[app saveContext];

刪除數(shù)據(jù)

[app.managedObjectContext deleteObject:object];
[app saveContext];

查詢數(shù)據(jù)

     //創(chuàng)建取回數(shù)據(jù)請求
    NSFetchRequest*request=[[NSFetchRequest alloc]init];
    //設置檢索的實體描述
    NSEntityDescription*entityDes=[NSEntityDescription entityForName:@"People" inManagedObjectContext:app.managedObjectContext];
    [request setEntity:entityDes];
    //指定對檢索結果的排序方式(根據(jù)People的name屬性,按升序排列)
    NSSortDescriptor*sortDestor=[[NSSortDescriptor alloc]initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:@[sortDestor]];
     //創(chuàng)建謂詞(搜索name=@"Kevin"的數(shù)據(jù))
    NSPredicate*predicate=[NSPredicate predicateWithFormat:@"name=%@",@"Kevin"];
    request.predicate=predicate;

    NSError*error=nil;
    //執(zhí)行請求,返回數(shù)組
    NSArray*fetchedResult=[app.managedObjectContext executeFetchRequest:request error:&error];

修改數(shù)據(jù)
修改數(shù)據(jù)其實就是將查詢操作時返回的數(shù)組中的元素取出,直接修改。(數(shù)組中的元素是指向內存地址的指針)

(People*)people=fetchedResult[0];
people.name=@"Tom";

項目開發(fā)過程中,在AppDelegate中初始化CoreData的核心對象并不是一種提倡的做法。我們通常的做法是封裝一個CoreDataManager的單例類。篇幅有限,這個將在下一章中介紹。

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容