国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

Swift利用CoreData實現一個通訊錄存儲詳解

2020-03-09 17:43:13
字體:
來源:轉載
供稿:網友

前言

相信大家對CoreData應該都不陌生,CoreData作為Apple的親兒子,依然在App需要存儲結構化數據上發揮著重要的作用。CoreData已經超過十年了,而且親爹還在積極的維護著它。

swift,coredata,使用,詳解

Core Data是iOS5之后才出現的一個數據持久化存儲框架,它提供了對象-關系映射(ORM)的功能,即能夠將對象轉化成數據,也能夠將保存在數據庫中的數據還原成對象。

雖然其底層也是由類似于SQL的技術來實現,但我們不需要編寫任何SQL語句,有點像Java開發中的Hibernate持久化框架

Core Data數據最終的存儲類型可以是:SQLite數據庫,XML,二進制,內存里,或自定義數據類型。

與SQLite區別:只能取出整個實體記錄,然后分解,之后才能得到實體的某個屬性。

在Monster、Indeed這些海外主流招聘網站看一下iOS的職位,基本上都會大大寫著要求會熟練使用CoreData。

然而這么一個成熟,被實踐檢驗過的代碼庫反而在國內使用并不是特別多。FMDB、Realm等等在被廣泛使用。經常在面試的時候問iOSer是不是了解數據庫,回答都是了解。再一細問,很多人也都是只使用到了FMDB,對于CoreData卻是了解甚少。

后來想了想,可能是因為CoreData的入門成本有點高,而且相關的中文資料比較少的緣故吧。

為了寫這個系列,還專門買來了objc.io的CoreData這本書。讀完之后受益匪淺。

這個系列要寫多少篇還沒有想好,大概也還是會從基本到高級的一個過渡。

第一篇通過一個通訊錄實現數據庫的讀取。第二篇會存儲更多類型的數據。

最終實現結果:

swift,coredata,使用,詳解

1. Core Data架構

一個基本的 Core Data 棧由四個主要部分組成:托管對象 (NSManagedObject),托管對象上下文 (NSManagedObjectContext),持久化存儲協調器 (NSPersistentStoreCoordinator),以及持久化存儲 (NSPersistentStore)。

swift,coredata,使用,詳解

  • NSManagedObject是我們的數據模型,也就是我們存儲的對象。這些對象都保存在NSManagedObjectContext中,每個存儲對象都知道自己對應哪個上下文。
  • NSManagedObjectContext :日常打交道的都是這個。其他三個在數據遷移的時候才會看到。
  • NSPersistenStoreCoordinator :是模型和存儲數據庫之間的橋梁,負責兩者之間最復雜的細節隱藏。

關于Context想多說點,因為是天天都打交道的嘛。它其實是內存中的一塊區域,對象所有的操作都需要一個context。直到save之前,都是在內存中,不會對數據庫中的內容有任何影響。每一個托管對象都對應一個Context,一個對象只會跟一個特定的Context打交道。直到生命周期結束。

Context是線程不安全的。

2. CoreData的基本讀取操作

2. 1 獲取CoreData已經保存數據的五個步驟

  • 獲取總代理和托管對象總管
  • 從Entity獲取一個fetchRequest
  • 根據fetchRequest,從managedContext中查詢數據
  • 保存。保存過程中可能會出錯,要做一下處理。
  • 添加到數組中

2.2 基本存儲

  • 獲取總代理和托管對象總管
  • 建立一個Entity
  • 保存內容
  • 保存Entity到托管對象。如果保存失敗,進行處理
  • 保存到數組中,更新UI

3. 更新一個通訊錄的列表頁Demo

  • 需求:完成一個通訊錄的列表頁。要求:
  • 從本地數據庫中讀取名字列表
  • 點擊增加可以添加一個名字
  • 添加的名字可以保存到本地數據庫中

好,接下來咱們來一步一步實現這個需求。為了突出重點,咱們先從最簡單的開始,使用默認帶數據庫的工程進行著手。

3.1 Xcode創建默認帶數據庫的工程

swift,coredata,使用,詳解

在 Xcode 創建工程時,提供了創建 CoreData 的模板,只需要我們在創建時,勾選 CoreData 選項,Xcode 就會自動創建出數據模型文件。

這個Demo用這個創建,純粹是為了簡單直奔主題。不然還要一開始分享很多其他的內容,看官們會覺得膩的。

但是,實際開發中不建議使用這種方式創建。通常情況下我們都會把生成的模板代碼都刪除的。

3.2 創建本地數據庫模板

swift,coredata,使用,詳解

勾選完成之后,會看到一個后綴名是"xcdatamodeld"的文件,這個就是咱們的數據庫模板啦。

當然,現在里面是還不能存數據的,還需要我們設置一下字段名稱。

swift,coredata,使用,詳解

第一步,要添加一個Entity,這個就相當于是數據庫中的一張表。

第二步,對新建的Entity命名。

第三步,設計Entity里面的屬性。咱們這個Demo的需求里面只需要一個人名,所以就只設置了一個名字叫做name的屬性,類型是String。

其他更多的屬性類型,我們會在下面一篇文章分享。

3.3 查詢本地數據

咦?在最開始的不是說一個基本的 Core Data 棧由四個主要部分組成嘛?怎么沒有看到吶?

來來來,這就是最開始我們使用Xcode創建默認帶數據庫的工程的原因。使用了這個選項,會自動的在AppDelegate中生成相應的代碼。確實簡化了咱們第一次學習的成本,但是就像沒人會把所有代碼都寫在Controller里面一樣,在APPDelegate也不會寫這些東西。

 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 步驟一:獲取總代理和托管對象總管 let appDelegate = UIApplication.shared.delegate as! AppDelegate  let managedObectContext = appDelegate.persistentContainer.viewContext // 步驟二:建立一個獲取的請求 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person") // 步驟三:執行請求 do {  let fetchedResults = try managedObectContext.fetch(fetchRequest) as? [NSManagedObject]  if let results = fetchedResults {  people = results    tableView.reloadData()  }   } catch {  fatalError("獲取失敗") } }

3.4 插入并保存數據至本地數據庫

private func saveName(text: String) { // 步驟一:獲取總代理和托管對象總管 let appDelegate = UIApplication.shared.delegate as! AppDelegate  let managedObectContext = appDelegate.persistentContainer.viewContext  // 步驟二:建立一個entity let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedObectContext)  let person = NSManagedObject(entity: entity!, insertInto: managedObectContext)  // 步驟三:保存文本框中的值到person person.setValue(text, forKey: "name")  // 步驟四:保存entity到托管對象中。如果保存失敗,進行處理 do { try managedObectContext.save() } catch { fatalError("無法保存") }  // 步驟五:保存到數組中,更新UI people.append(person)}

所有的源代碼在這里

github地址:https://github.com/Stanbai/CoreDataDemo.git

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开鲁县| 大英县| 内黄县| 海南省| 互助| 定安县| 玛纳斯县| 云浮市| 措美县| 上杭县| 亚东县| 琼结县| 荆州市| 微山县| 若尔盖县| 江北区| 镇江市| 阿尔山市| 盘山县| 若羌县| 监利县| 金沙县| 平定县| 贡觉县| 泽州县| 苍山县| 襄樊市| 乐昌市| 西和县| 吐鲁番市| 秭归县| 宜春市| 庆云县| 涞源县| 奇台县| 乌兰察布市| 同心县| 安新县| 英吉沙县| 尉犁县| 渝北区|