標籤:
資料持久化之CoreDate
一. Core Data簡介
Core Data是蘋果公司為了實現資料持久化提供的一個架構,而不是一個資料庫,提供對象—關係映射【ORM】的功能(將對象轉化為資料,也能將儲存在資料庫的資料還原為對象)。
雖然底層操作與SQLite相似,但是並不直接寫SQL語句,而且只能整個取出實體記錄,然後分解之後才能得到某個屬性。
Core Data能儲存的類型:SQLite資料庫、XML、二進位、自訂資料類型
一般情況下,Core Data的資料存在沙箱下的Document下,可以使用maseSQlite查看
Core Data關鍵類
NSManagedObjectModel(被管理的物件模型)
資料庫所有表格或資料結構,包含各實體的定義資訊
作用:添加實體的屬性,建立屬性之間的關係
操作方法:視圖編輯器,或代碼
NSManagedObjectContext(被管理的物件內容)
操作實際內容(操作持久層)
作用:插入,更新,查詢,刪除資料
NSManagedObject(被管理的資料對象)
相當於資料庫中的一條記錄
NSPersistentStoreCoordinator(持久化儲存協調器)
相當於資料庫的連接器
作用:設定資料存放區的名字,位置,儲存方式,和儲存時機
NSFetchRequest(擷取資料的請求)
相當於資料庫的查詢語句
NSPredicate(謂詞)
查詢資料的過濾條件
NSEntityDescription(實體描述)
對實體結構的描述,用於建立對象
關鍵詞:實體:Entity(相當於表,首字母大寫) 屬性:Attrubute(相當於欄位,首字母小寫)關聯:表與表之間可以關聯。
Q:如果需要儲存圖片附件怎麼辦?
A:先將附件存起來,然後存地址到資料表中
二. Core Data使用配置
要使用CoreDate必須先配置,最好是在建立工程的使用就選擇Use Core Data,將省去很多配置代碼,可以使用可視化配置,也可以使用代碼建立。
主要步驟為:
1.建立工程時選擇Use Core Data
2.建立實體(設定表屬性和關聯)
配置詳情見::宏創學院?CoreData(一) —簡介
三. CoreData具體使用
最終要的是獲得上下文NSManagedObjectContext,通過它實現增刪改查,實際開發中記得將資料將這些功能放在不同的函數中。
//使用CoreData func useCoreData(){ //存放資料在沙箱的document下 // 擷取管理資料的上下文(在建立工程時選擇使用Use Core Data才會方便實現下面代碼,如果沒有選擇,必須代碼實現配置【自行百度】) let app = UIApplication.sharedApplication().delegate as! AppDelegate let context = app.managedObjectContext // *插入 通過實體建立對象 var user = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as! Users//為什要加as! Users?因為不加就會返回的是MamageObject // 操作對象 user.id=1 user.name = "Jom" user.age = 21 //*儲存資料(完成插入) do { try context.save() }catch is NSError{ print("儲存失敗") } // *查詢操作 var fetchRequest = NSFetchRequest(entityName: "Users")//聲明實體請求(注意實體名為首大寫)【fetch:取得】 //設定查詢條件 fetchRequest.predicate = NSPredicate(format: "id = '1' AND name='Jom'" )//多條件尋找,還可以模糊尋找 let result = try! context.executeFetchRequest(fetchRequest) as! [Users]//傳回值為數組,如果沒有查詢到就會返回空數組 //let fetchedEmployees = try context.executeFetchRequest(fetchRequest) as! [Users]//傳回值為數組 這樣算是全部查詢吧 do{ let result = try context.executeFetchRequest(fetchRequest) as! [Users] print("數量為",result.count) ///【重要】根據這個判斷是否尋找到,才進行修改或刪除,不讓空數組操縱會出錯 }catch is NSError{ print("沒有查尋到") } defer{ print("查詢結果為:")} //*修改(在查詢的基礎上,對查詢到的對象進行修改,然後儲存即可) if result.count==0 {print("無查詢值,無法修改")}//原來為Tom //出過錯,因為沒有查尋到,直接對一個空數組賦值,導致程式終止,建以後這種情況判斷是否為空白先。 else{ print("可以修改") result[0].id=2 } do{ try context.save()//實際中應捕獲異常 }catch{ print("修改失敗") } //刪除資料(也是在尋找到的基礎上,刪除,在儲存一次就會) if result.count==0 {print("無查詢值,無法修改")}//原來為Tom //出過錯,因為沒有查尋到,直接對一個空數組賦值,導致程式終止,建以後這種情況判斷是否為空白先。 else{ print("可以刪除") context.deleteObject(result[0]) } try! context.save() }
四、使用NSFetchedResultsController
在開發過程中,可能會使用CoreData在表格(table)中顯示,蘋果公司為了最佳化記憶體,特意設計了這個控制器,提供啊程式效能
在控制器中使用的時候一般是遵循它的NSFetchedResultsDelegate協議,匯入import CoreData,以及匯入實體就可以自行建立NSFetchedResultsController(類似一個方法)
詳細使用請參考:http://www.starming.com/index.php?v=index&view=30
官網文檔;NSFetchedResultsController Class Reference
NSFetchedResultsControllerDelegate Protect Reference
官網文檔:CoreData Programming Guide
introduction to Core Data Reference Collection <重點>
ios開發學習筆記--資料持久化之Core Data