最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

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

前言

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


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

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

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

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

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

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

后來(lái)想了想,可能是因?yàn)镃oreData的入門(mén)成本有點(diǎn)高,而且相關(guān)的中文資料比較少的緣故吧。

為了寫(xiě)這個(gè)系列,還專門(mén)買(mǎi)來(lái)了objc.io的CoreData這本書(shū)。讀完之后受益匪淺。

這個(gè)系列要寫(xiě)多少篇還沒(méi)有想好,大概也還是會(huì)從基本到高級(jí)的一個(gè)過(guò)渡。

第一篇通過(guò)一個(gè)通訊錄實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀取。第二篇會(huì)存儲(chǔ)更多類型的數(shù)據(jù)。

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


1. Core Data架構(gòu)

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


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

關(guān)于Context想多說(shuō)點(diǎn),因?yàn)槭翘焯於即蚪坏赖穆?。它其?shí)是內(nèi)存中的一塊區(qū)域,對(duì)象所有的操作都需要一個(gè)context。直到save之前,都是在內(nèi)存中,不會(huì)對(duì)數(shù)據(jù)庫(kù)中的內(nèi)容有任何影響。每一個(gè)托管對(duì)象都對(duì)應(yīng)一個(gè)Context,一個(gè)對(duì)象只會(huì)跟一個(gè)特定的Context打交道。直到生命周期結(jié)束。

Context是線程不安全的。

2. CoreData的基本讀取操作

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

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

2.2 基本存儲(chǔ)

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

3. 更新一個(gè)通訊錄的列表頁(yè)Demo

  • 需求:完成一個(gè)通訊錄的列表頁(yè)。要求:
  • 從本地?cái)?shù)據(jù)庫(kù)中讀取名字列表
  • 點(diǎn)擊增加可以添加一個(gè)名字
  • 添加的名字可以保存到本地?cái)?shù)據(jù)庫(kù)中

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

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


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

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

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

3.2 創(chuàng)建本地?cái)?shù)據(jù)庫(kù)模板


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

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

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

第二步,對(duì)新建的Entity命名。

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

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

3.3 查詢本地?cái)?shù)據(jù)

咦?在最開(kāi)始的不是說(shuō)一個(gè)基本的 Core Data 棧由四個(gè)主要部分組成嘛?怎么沒(méi)有看到吶?

來(lái)來(lái)來(lái),這就是最開(kāi)始我們使用Xcode創(chuàng)建默認(rèn)帶數(shù)據(jù)庫(kù)的工程的原因。使用了這個(gè)選項(xiàng),會(huì)自動(dòng)的在AppDelegate中生成相應(yīng)的代碼。確實(shí)簡(jiǎn)化了咱們第一次學(xué)習(xí)的成本,但是就像沒(méi)人會(huì)把所有代碼都寫(xiě)在Controller里面一樣,在APPDelegate也不會(huì)寫(xiě)這些東西。

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

3.4 插入并保存數(shù)據(jù)至本地?cái)?shù)據(jù)庫(kù)

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

所有的源代碼在這里

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

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

總結(jié)

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

相關(guān)文章

  • Swift學(xué)習(xí)教程之訪問(wèn)控制詳解

    Swift學(xué)習(xí)教程之訪問(wèn)控制詳解

    訪問(wèn)控制可以限定你在源文件或模塊中訪問(wèn)代碼的級(jí)別,也就是說(shuō)可以控制哪些代碼你可以訪問(wèn),哪些代碼你不能訪問(wèn)。下面這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之訪問(wèn)控制的相關(guān)資料,需要的朋友可以參考下。
    2017-08-08
  • 詳解Swift 結(jié)構(gòu)體

    詳解Swift 結(jié)構(gòu)體

    這篇文章主要介紹了Swift 結(jié)構(gòu)體的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-09-09
  • swift計(jì)步器CMPedometer的使用方法

    swift計(jì)步器CMPedometer的使用方法

    這篇文章主要為大家詳細(xì)介紹了swift計(jì)步器CMPedometer的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Swift Access Control訪問(wèn)控制與斷言詳細(xì)介紹

    Swift Access Control訪問(wèn)控制與斷言詳細(xì)介紹

    這篇文章主要介紹了Swift Access Control訪問(wèn)控制與斷言,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • swift中的@UIApplicationMain示例詳解

    swift中的@UIApplicationMain示例詳解

    這篇文章主要給大家介紹了關(guān)于swift中@UIApplicationMain的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • 初探Swift3.0帶來(lái)的變化匯總

    初探Swift3.0帶來(lái)的變化匯總

    這個(gè)周末抽空看了下swift3.0的變化,今天小編通過(guò)本教程給大家分享Swift3.0帶來(lái)的變化,非常不錯(cuò),感興趣的朋友參考下吧
    2016-12-12
  • Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法

    Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法

    這篇文章主要介紹了Swift 使用 Observe 監(jiān)測(cè)頁(yè)面滾動(dòng)的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • swift 可選型的使用詳解

    swift 可選型的使用詳解

    可選性是Swift提供的一個(gè)特殊類型,它為我們編寫(xiě)程序提供便利的條件。這篇文章主要介紹了swift 可選型的使用詳解,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • Swift中的HTTP模擬測(cè)試示例詳解

    Swift中的HTTP模擬測(cè)試示例詳解

    這篇文章主要為大家介紹了Swift中的HTTP模擬測(cè)試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

    Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

    這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12

最新評(píng)論

永川市| 多伦县| 会泽县| 亳州市| 丹寨县| 固始县| 社旗县| 巴青县| 朔州市| 乌恰县| 正镶白旗| 北安市| 东丰县| 崇文区| 托克逊县| 汶川县| 石屏县| 龙里县| 海城市| 南川市| 台湾省| 六盘水市| 白银市| 龙里县| 武川县| 唐河县| 安达市| 宁陵县| 稻城县| 闻喜县| 温州市| 平凉市| 黑龙江省| 江孜县| 齐齐哈尔市| 林芝县| 且末县| 城固县| 肇源县| 甘孜县| 南丹县|