數據庫CoreData 的簡單使用(1)

1、CoreData的概述。

  1.簡介sql

  • CoreData ⽤用於作數據持久化,是數據持久化的最佳⽅方式, 適合⼤大數據量的存儲和查詢
  • CoreData不是數據庫,CoreData數據的最終存儲形式能夠是SQLite數據庫、XML、二進制、內存裏,或者是自定義數據類型來存儲數據
  • 使用CoreData,須要導入CoreData框架(若是開始建立新的工程時候✅use CoreData選項,就不用導入了,可是須要在代碼中導入)

 

    2.優勢

  • 使用CoreData操做無無需編寫SQL語句數據庫

  •  SQlite經過使用SQL語句操做對象,CoreData使用面向對象的方式操做數據數組

  • 可以合理管理內存,避免使用sql的麻煩,高效框架

  3.CoreData的主要對象(構成)

  1. NSManagedObjectContext :  負責應用和數據酷之間的交互(CRUD)
  2. NSPersistentStoreCoordinator:添加持久化存儲助理,是物理數據存儲的物理文件和程序之間的聯繫橋樑,至關於數據庫的鏈接器,負責管理不一樣對象的上下文
  3. NSManagedObjectModel  :被管理的對象模型,對應定義的模型文件
  4. NSEntityDescription :實體描述(結構),至關於表格結構
  5. NSManagedObject:被管理的數據記錄,至關於表格的數據記錄
  6. NSFetchRequest :數據請求,至關於查詢語句

2、直接使用Core Data 寫數據

步驟:性能

(1)建立數據模型大數據

 

(2)代碼以下spa

須要導入頭文件code

 NSManagedObjectContext *_context; orm

 1  //1.獲取數據模型地址
 2     NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
 3     //2.讀取數據模型
 4     NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:fileURL];
 5     //3.根據model初始化數據助理
 6     NSPersistentStoreCoordinator *coodinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
 7     //4.將數據存儲到沙盒下
 8     NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/coreData.db"];
 9     NSURL *pathURL = [NSURL fileURLWithPath:path];
10     NSLog(@"%@", path);
11     NSError *error = nil;
12     NSPersistentStore *store = [coodinator addPersistentStoreWithType:NSSQLiteStoreType //存儲的形式(我選擇的是SQLite存儲,還有另外三種)
13                                                         configuration:nil URL:pathURL options:nil error:&error];
14     if (store == nil) {//數據庫存在異常 直接拋異
15         [NSException raise:@"" format:@"error: %@", [error localizedDescription]];
16     }
17     if (error) {
18         
19         NSLog(@"open error :%@", error);
20     }else {
21         
22         NSLog(@"open success");
23     }
24     _context = [[NSManagedObjectContext alloc] init];
25     _context.persistentStoreCoordinator = coodinator;

 

***PersistentStoreWithType存儲的形式有如下四種:對象

  •  NSSQLiteStoreType :  SQLite數據庫
  •  NSXMLStoreType:XML存儲形式
  •  NSBinaryStoreType:二進制平面文件
  •  NSInMemoryStoreType:內存庫
雖然這3種類型的性能從速度上來講都差很少,但從數據模型中保留下來的信息卻不同,在幾乎全部的情景中,都應該採用默認設置,使用SQLite做爲持久化存儲庫。

運行結束以後:

能夠根據地址去訪問:

打開方式:

文件存在查看:

屬性添加查看:

能夠看出,.使用SQLite存儲時,數據庫結構存儲的SQLite數據庫表名稱:大寫「Z」加上實體名稱大寫,一個實體至關於一張表,具體的字段名稱:大寫「Z」加上實體屬性名稱大寫

3、對數據進行操做(增刪改)

(1)添加數據。

封裝一個方法直接進行數據的添加。

 1 //添加數據
 2 - (NSManagedObject *)insertEntity:(NSString *)entityName withParams:(NSDictionary *)params {    
 3     // 1. 根據模型初始化一個對象
 4     NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context];
 5     //添加的數據內容
 6     /*如下數據是字典中的寫入數據
 7     [object setValue:@"瑪瑙" forKey:@"name"];
 8     [object setValue:@18 forKey:@"age"];
 9      */
10     //用字典接收外部傳值
11     for (NSString *key in params) {
12         NSLog(@"%@",key);
13         [object setValue:[params objectForKey:key] forKey:key];
14     }
15     NSError *error = nil;
16     //保存數據
17     BOOL success = [_context save:&error];
18     if (success) {
19         NSLog(@"添加數據成功");
20     }else {
21         NSLog(@"添加數據失敗");
22     }
23     return object;
24 }

(2)查詢數據

封裝一個方法,用來查詢數據。

 1 //查詢數據
 2 - (NSArray *)queryWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate withSortDescriptor:(NSArray *)sorts{
 3     //1.構造一個查詢請求
 4     NSFetchRequest *request = [[NSFetchRequest alloc] init];
 5     //2.設置查詢請求的模型(實體)
 6     request.entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:_context];
 7     //3.設置查詢條件
 8     NSPredicate *dicate = [NSPredicate predicateWithFormat:predicate ];
 9     request.predicate = dicate;
10     //設置分頁
11     [request setFetchOffset:0];//讀取數據庫的遊標偏移量,從遊標開始讀取數據
12     [request setFetchLimit:5];//每次要取多少條數據,5就是每次從數據庫讀取5條數據
13 //    [request setFetchBatchSize:500];//從數據庫裏每次加載500條數據來篩選數據,用於下拉刷新等
14     if (sorts) {
15         //排序設置 NSSortDescriptor:排序條件  可任意存在多個
16         NSMutableArray *sortArr = [[NSMutableArray alloc] init];
17         //遍歷傳入的排序條件字符串數組,生成排序條件
18         for (NSString *sortString in sorts) {
19             //遍歷結果
20             NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:sortString ascending:YES];
21             //加入數組
22             [sortArr addObject:sort];
23         }
24         //將排序條件的數組查詢請求,按數組的先後肯定排序的優先級
25         request.sortDescriptors = sortArr;
26     }    
27     //4. 執行查詢請求
28     NSError *error = nil;
29     NSArray *objects = [_context executeFetchRequest:request error:&error];
30     if (error) {
31         NSLog(@"查詢失敗: %@",error);
32         //失敗以後返回nil
33         return nil;
34     }else {
35         NSLog(@"查詢成功");
36     }
37     return objects;
38 }

(3)刪除數據

刪除數據和修改數據都須要用到查詢。

 1 //刪除數據
 2 - (void)deleteWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate {
 3     //調用查詢方法(查詢方法是一個數組,所以用 ‘NSArray *’ 接收)
 4     NSArray *objects = [self queryWithEntity:entityName withPredicate:predicate withSortDescriptor:nil];
 5     
 6     for (NSManagedObject *object in objects) {
 7         //刪除選擇的項
 8         [_context deleteObject:object];
 9 //        NSLog(@"刪除成功");
10     }
11     //使數據庫的內容與上下文的內容同步,(咱們對數據的增刪改都是對上下文的修改,須要經過助理與數據庫進行刷新同步。nil是錯誤碼--error)
12     [_context save:nil];
13 }

由此看出,封裝一個好的方法的重要性。

 

下一篇將介紹兩個文件進行鏈接的方法,以及基於SQLite使用Core Data。

 

歡迎讀者查看,有錯歡迎指正。本文是原創文章,如若轉載請標明出處。

相關文章
相關標籤/搜索