Swift中數(shù)據(jù)存儲(chǔ)(二)之CoreData初探

一,Core Data介紹

① 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ì)象。
② 雖然其底層也是由類(lèi)似于SQL的技術(shù)來(lái)實(shí)現(xiàn),但我們不需要編寫(xiě)任何SQL語(yǔ)句,有點(diǎn)像Java開(kāi)發(fā)中的Hibernate持久化框架
③ Core Data數(shù)據(jù)最終的存儲(chǔ)類(lèi)型可以是:SQLite數(shù)據(jù)庫(kù),XML,二進(jìn)制,內(nèi)存里,或自定義數(shù)據(jù)類(lèi)型。
④ 與SQLite區(qū)別:只能取出整個(gè)實(shí)體記錄,然后分解,之后才能得到實(shí)體的某個(gè)屬性。

二,Core Data的使用準(zhǔn)備 - 數(shù)據(jù)模型和實(shí)體類(lèi)的創(chuàng)建
① 創(chuàng)建項(xiàng)目的時(shí)候,勾選“Use Core Data”。完畢后在AppDelegate 中,會(huì)生成相關(guān)代碼。

項(xiàng)目文件創(chuàng)建.png

② 打開(kāi)項(xiàng)目中的 xcdatamodeld
** 文件,在右邊的數(shù)據(jù)模型編輯器的底部工具欄點(diǎn)擊 Add Entity
** 添加實(shí)體,實(shí)體名稱(chēng)設(shè)置為"User"。
同時(shí)在屬性欄中對(duì)實(shí)體命名進(jìn)行修改,并在 Attribute
** 欄目中添加 id
,username
password
** 三個(gè)屬性
文件.png

③ 點(diǎn)擊上圖中
Editor Style
可以查看實(shí)體的關(guān)系圖,如下圖
視圖關(guān)系圖.png

④ 要為每一個(gè)實(shí)體生成一個(gè)對(duì)應(yīng)的 創(chuàng)建NSManagedObject 子類(lèi),通過(guò)類(lèi)的成員屬性來(lái)訪問(wèn)和獲取數(shù)據(jù)。選中
.xcdatamodeld
文件,點(diǎn)擊Editor里面的Create NSManagerObject SubClass創(chuàng)建類(lèi),如下圖:
創(chuàng)建NSManagedObject子類(lèi).png

⑤ 創(chuàng)建完成后,項(xiàng)目中會(huì)多出** User+CoreDataProperties.swiftUser.Swift**文件

三 Core Data的使用
首先創(chuàng)建一個(gè)CoredData的工具類(lèi),用來(lái)操作CoreData,并導(dǎo)入import CoreData
① 插入數(shù)據(jù),并保存

// MARK:- 插入(保存)數(shù)據(jù)操作
  internal func insetData(){
    
    // 獲取管理的數(shù)據(jù)上下文  對(duì)象
    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    
    // 創(chuàng)建User對(duì)象
    /**
     insertNewObjectForEntityForName 里面
     <#T##entityName: String##String#> 實(shí)體名稱(chēng)
     <#T##NSManagedObjectContext#> 上下文
     */
    let user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as! User
    
    // 對(duì)象賦值
    user.id = 1
    user.username = "RookieYX"
    user.password = "1234"
    
    // 保存
    do{
      try context.save()
      print("保存成功")
    }
    catch{
      fatalError("無(wú)法保存 \\\\(error)")
    }
  }
  

② 查詢(xún)數(shù)據(jù)操作

// MARK:- 查詢(xún)數(shù)據(jù)操作
  internal func searchData(){
    
    // 獲取管理的數(shù)據(jù)上下文  對(duì)象
    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    
    // 聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest:NSFetchRequest =  NSFetchRequest()
    fetchRequest.fetchLimit = 10  // 限定查詢(xún)結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0  // 查詢(xún)的偏移量
    
    // 聲明一個(gè)實(shí)體結(jié)構(gòu)
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
    // 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
    fetchRequest.entity = entity
    
    // 設(shè)置查詢(xún)條件
    let predicate = NSPredicate(format: "id = '1'", "")
    fetchRequest.predicate = predicate
    
    // 查詢(xún)操作
    do{
      let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
      // 遍歷查詢(xún)的結(jié)果
      for info:User in fetchedObjects as! [User] {
        print("id=\\\\(info.id)")
        print("username=\\\\(info.username)")
        print("password=\\\\(info.password)")
      }
    }
    catch {
      fatalError("不能保存:\\\\(error)")
    }
  }

③ 修改數(shù)據(jù)操作

internal func updateData(){
    // 獲取管理的數(shù)據(jù)上下文  對(duì)象
    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    
    // 聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest:NSFetchRequest =  NSFetchRequest()
    fetchRequest.fetchLimit = 10  // 限定查詢(xún)結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0  // 查詢(xún)的偏移量
    
    // 聲明一個(gè)實(shí)體結(jié)構(gòu)
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
    // 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
    fetchRequest.entity = entity
    
    // 設(shè)置查詢(xún)條件
    let predicate = NSPredicate(format: "id = '1'", "")
    fetchRequest.predicate = predicate
    
    // 查詢(xún)操作
    do{
      let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
      // 遍歷查詢(xún)的結(jié)果
      for info:User in fetchedObjects as! [User] {
        //修改密碼
        info.password = "abcd"
        //重新保存
        try context.save()
      }
    }
    catch {
      fatalError("不能保存:\\\\(error)")
    }
  }
  

④ 刪除數(shù)據(jù)操作

// MARK:- 刪除數(shù)據(jù)操作
  internal func delecteData(){
    // 獲取管理的數(shù)據(jù)上下文  對(duì)象
    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    
    // 聲明數(shù)據(jù)的請(qǐng)求
    let fetchRequest:NSFetchRequest =  NSFetchRequest()
    fetchRequest.fetchLimit = 10  // 限定查詢(xún)結(jié)果的數(shù)量
    fetchRequest.fetchOffset = 0  // 查詢(xún)的偏移量
    
    // 聲明一個(gè)實(shí)體結(jié)構(gòu)
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("User", inManagedObjectContext: context)
    // 設(shè)置數(shù)據(jù)請(qǐng)求的實(shí)體結(jié)構(gòu)
    fetchRequest.entity = entity
    
    // 設(shè)置查詢(xún)條件
    let predicate = NSPredicate(format: "id = '1'", "")
    fetchRequest.predicate = predicate
    
    // 查詢(xún)操作
    do{
      let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
      // 遍歷查詢(xún)的結(jié)果
      for info:User in fetchedObjects as! [User] {
        //刪除對(duì)象
        context.deleteObject(info)
      }
      // 重新保存 - 更新到數(shù)據(jù)庫(kù)中
      try context.save()
    }
    catch {
      fatalError("不能保存:\\\\(error)")
    }
  }

** 四 在ViewController中使用我們的CoreData工具類(lèi)**

    let tool = CoreDataTool()
    // 插入數(shù)據(jù)
    tool.insetData()
    // 查詢(xún)
    tool.searchData()
    // 更新修改
    tool.updateData()
    // 刪除
    tool.delecteData()

學(xué)習(xí)NSUserDefaults/ NSKeyedArchiver/ write儲(chǔ)存,可以看之前的文章

Swift數(shù)據(jù)存儲(chǔ)(一)

Swift數(shù)據(jù)存儲(chǔ)SQLite

之后將持續(xù)更新CoreData的深入學(xué)習(xí)知識(shí),想要學(xué)習(xí)的同學(xué)可以繼續(xù)關(guān)注

本文參考:www.mamicode.com/info-detail-1061698.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容