欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift利用CoreData實現(xiàn)一個通訊錄存儲詳解

 更新時間:2017年12月05日 09:37:44   作者:非典型技術(shù)宅  
這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實現(xiàn)一個通訊錄存儲的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問題,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

相信大家對CoreData應(yīng)該都不陌生,CoreData作為Apple的親兒子,依然在App需要存儲結(jié)構(gòu)化數(shù)據(jù)上發(fā)揮著重要的作用。CoreData已經(jīng)超過十年了,而且親爹還在積極的維護著它。


Core Data是iOS5之后才出現(xiàn)的一個數(shù)據(jù)持久化存儲框架,它提供了對象-關(guān)系映射(ORM)的功能,即能夠?qū)ο筠D(zhuǎn)化成數(shù)據(jù),也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成對象。

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

Core Data數(shù)據(jù)最終的存儲類型可以是:SQLite數(shù)據(jù)庫,XML,二進制,內(nèi)存里,或自定義數(shù)據(jù)類型。

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

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

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

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

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

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

第一篇通過一個通訊錄實現(xiàn)數(shù)據(jù)庫的讀取。第二篇會存儲更多類型的數(shù)據(jù)。

最終實現(xiàn)結(jié)果:


1. Core Data架構(gòu)

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


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

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

Context是線程不安全的。

2. CoreData的基本讀取操作

2. 1 獲取CoreData已經(jīng)保存數(shù)據(jù)的五個步驟

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

2.2 基本存儲

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

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

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

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

3.1 Xcode創(chuàng)建默認(rèn)帶數(shù)據(jù)庫的工程


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

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

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

3.2 創(chuàng)建本地數(shù)據(jù)庫模板


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

當(dāng)然,現(xiàn)在里面是還不能存數(shù)據(jù)的,還需要我們設(shè)置一下字段名稱。

第一步,要添加一個Entity,這個就相當(dāng)于是數(shù)據(jù)庫中的一張表。

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

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

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

3.3 查詢本地數(shù)據(jù)

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

來來來,這就是最開始我們使用Xcode創(chuàng)建默認(rèn)帶數(shù)據(jù)庫的工程的原因。使用了這個選項,會自動的在AppDelegate中生成相應(yīng)的代碼。確實簡化了咱們第一次學(xué)習(xí)的成本,但是就像沒人會把所有代碼都寫在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")
 
// 步驟三:執(zhí)行請求
 do {
  let fetchedResults = try managedObectContext.fetch(fetchRequest) as? [NSManagedObject]
  if let results = fetchedResults {
  people = results
  
  tableView.reloadData()
  }
  
 } catch {
  fatalError("獲取失敗")
 }
 }

3.4 插入并保存數(shù)據(jù)至本地數(shù)據(jù)庫

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("無法保存")
 }
 
 // 步驟五:保存到數(shù)組中,更新UI
 people.append(person)
}

所有的源代碼在這里

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

本地下載:http://xiazai.jb51.net/201712/yuanma/CoreDataDemo(jb51.net).rar

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Swift教程之方法詳解

    Swift教程之方法詳解

    這篇文章主要介紹了Swift教程之方法詳解,方法是關(guān)聯(lián)到一個特定類型的函數(shù),類、結(jié)構(gòu)、枚舉所有可以定義實例方法,封裝特定任務(wù)和功能處理給定類型的一個實例,需要的朋友可以參考下
    2015-01-01
  • Swift 字符串類型及常用方法詳解總結(jié)

    Swift 字符串類型及常用方法詳解總結(jié)

    Swift 字符串是一系列字符的集合。例如 "Hello, World!" 這樣的有序的字符類型的值的集合,它的數(shù)據(jù)類型為 String,接下來文章將詳細(xì)探討
    2021-11-11
  • Swift實現(xiàn)倒計時5秒功能

    Swift實現(xiàn)倒計時5秒功能

    這篇文章主要為大家詳細(xì)介紹了Swift實現(xiàn)倒計時5秒功能,在“登錄”和“注冊”頁面也有相似功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • swift中獲取字符串前綴的七種方法總結(jié)

    swift中獲取字符串前綴的七種方法總結(jié)

    在日常的開發(fā)中,經(jīng)常會需要獲取一個字符串的前綴,在這篇文章中我總結(jié)了在 Swift 中檢查字符串前綴的多種方法分享給大家,看看有沒有你不知道的
    2023-12-12
  • Swift中重寫和重載的使用與對比總結(jié)

    Swift中重寫和重載的使用與對比總結(jié)

    這篇文章主要給大家介紹了關(guān)于Swift中重寫和重載的使用方法,以及重寫和重載的對比分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • SwiftUI?引導(dǎo)頁界面實現(xiàn)示例

    SwiftUI?引導(dǎo)頁界面實現(xiàn)示例

    這篇文章主要為大家介紹了SwiftUI?引導(dǎo)頁界面實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 初步理解Swift中的泛型

    初步理解Swift中的泛型

    這篇文章主要介紹了初步理解Swift中的泛型,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • 在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實現(xiàn)解析(推薦)

    在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實現(xiàn)解析(推薦)

    這篇文章主要介紹了在Swift中使用KVO的細(xì)節(jié)以及內(nèi)部實現(xiàn)解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Swift函數(shù)提前返回實例詳解

    Swift函數(shù)提前返回實例詳解

    函數(shù)相當(dāng)重要的,下面這篇文章主要給大家介紹了關(guān)于Swift函數(shù)提前返回的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例

    利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例

    卡片橫向滑動動畫效果相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07

最新評論