1.簡介sql
使用CoreData操做無無需編寫SQL語句數據庫
SQlite經過使用SQL語句操做對象,CoreData使用面向對象的方式操做數據數組
可以合理管理內存,避免使用sql的麻煩,高效框架
步驟:性能
(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存儲的形式有如下四種:對象
雖然這3種類型的性能從速度上來講都差很少,但從數據模型中保留下來的信息卻不同,
在幾乎全部的情景中,都應該採用默認設置,使用SQLite做爲持久化存儲庫。
運行結束以後:
能夠根據地址去訪問:
打開方式:
文件存在查看:
屬性添加查看:
能夠看出,.使用SQLite存儲時,數據庫結構存儲的SQLite數據庫表名稱:大寫「Z」加上實體名稱大寫,一個實體至關於一張表,具體的字段名稱:大寫「Z」加上實體屬性名稱大寫
(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。
歡迎讀者查看,有錯歡迎指正。本文是原創文章,如若轉載請標明出處。