【Swift】CoreData的使用


CoreData只是iOS數據持久化的其中一個方法,所有數據持久化如下

1、plist文件(屬性列表),通常用於儲存用戶設置,也zhi可以用於存儲捆綁的信息;

2、preference(偏好設置),常用於保存少量數據;

3、NSKeyedArchiver(歸檔),將內存中的對象實例保存成binary到磁盤並且可以逆向這個過程用來保存用戶操作狀態等;

4、SQLite 3,使用數據庫進行存儲;

5、CoreData,它提供了對象-關系映射(ORM)的功能,即能夠將OC對象轉化成數據,保存在SQLite數據庫文件中,也能夠將保存在數據庫中的數據還原成OC對象。

 

在新建項目時,把Use Core Data勾上

如果你創建時沒勾,可以參考別人的博客,自己手動添加

 

 

由於我勾選了Use Core Data,系統幫我生成了后綴為【xcdatamodeld】的檔案

單擊進入后,先創建實體(添加實體),然后添加屬性,最后為屬性設置需要存儲的類型(Type)

這里我為此實體(MyTest),添加唯一的屬性testSaveInt,類型為Int(Integer 16)

我這里只添加唯一屬性,這里額外推薦一篇很棒的博客,除了多屬性,里面還有提到屬性關聯,這個屬性被刪了,會影響到別的東西

具體在他寫的【四、邏輯與建模】,仔細看完他列舉的情景,就明白我在說什么了,不過他是用objective-c寫的,有點遺憾

 

接着創建一個NSManagedObject子類(點擊Editor -> Create NSmanagedObject Subclass...)

然后先選擇自己的項目(當初開始寫app時,創建的項目名稱)

最后再勾選剛剛創建的實體"MyTest"

 

創建完后,多出兩個檔案,分別是

MyTest+CoreDataClass.swift

MyTest+CoreDataProperties.swift(這個不用修改,它的作用是存放你剛剛添加的屬性,例如前面的testSaveInt)

 

我們在【MyTest+CoreDataClass.swift】添加自己封裝的方法,后續可以通過類的對象,來訪問此類的一些函數

以下的代碼,是對 Int 類型的變量 testSaveInt,做增刪改查的動作,具體流程如下

1、使用【增】的方法,寫入數據12

2、使用【】的方法,查詢資料庫是否有數據(for循環檢驗:有無用MyTest這個實體創建的資料庫?)

3、使用【改】的方法,找出實體"MyTest"里,數據為12的Int,更改為38

4、使用【】的方法,查詢數據是否被改變(假設第2步是成功的)

5、使用【刪】的方法,資料庫內,發現testSaveInt == 38 的,立刻刪除

6、使用【】的方法,看看資料庫內,是否都不存在數據了

import UIKit // 把這行加上
import Foundation
import CoreData

@objc(MyTest)
public class MyTest: NSManagedObject {
     
    // 獲取context
    func getContext() -> NSManagedObjectContext {
        let mDelegate = UIApplication.shared.delegate as! AppDelegate
        return mDelegate.persistentContainer.viewContext
    }
    
     
    // MARK: - 【增】的功能
    func coreDataAdd(command: String) {
        switch command {
            case "測試寫入": 
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                let newTest = NSEntityDescription.insertNewObject(forEntityName: "MyTest", into: mContext)as! MyTest
                
                newTest.testSaveInt = 12 
                
                mDelegate.saveContext()
            default:
                break
        }
    }
    
    // MARK: - 【刪】的功能
    func coreDataDelete(command: String) {
        switch command {
            case "測試刪除":
                // 獲取上下文
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                // 設置查詢的實體,此處的實體是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 請求實體(Fetch:取、拿來)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity
                                
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        if myTest.testSaveInt == 38 {
                            mContext.delete(myTest)
                            mDelegate.saveContext()
                        }
                    }
                } catch  {
                    print("刪除數據失敗")
               }
            default:
                break
        }
    }
    
    // MARK: - 【改】的功能
    func coreDataUpdate(command: String) {
        switch command {
            case "測試修改":
                // 獲取上下文
                let mDelegate = UIApplication.shared.delegate as! AppDelegate
                let mContext = mDelegate.persistentContainer.viewContext
                
                // 設置查詢的實體,此處的實體是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 請求實體(Fetch:取、拿來)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity        
                
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        if myTest.testSaveInt == 12 {
                            myTest.testSaveInt = 38
                            mDelegate.saveContext()
                        }
                    }
                } catch  {
                    print("修改數據失敗")
                }
                
            default:
                break
        }
    }
    
    // MARK: - 【查】的功能
    func coreDataSearch(command: String) {
        switch command {
            case "測試讀取":
                // 獲取上下文
                let mContext = getContext()
                
                // 設置查詢的實體,此處的實體是MyTest
                let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext)
                
                // 請求實體(Fetch:取、拿來)
                let request = NSFetchRequest<MyTest>()
                request.entity = entity
                                       
                do {
                    let results:[AnyObject]? = try mContext.fetch(request)
                    
                    for myTest in results as![MyTest] {
                        print("value=\(myTest.testSaveInt)")
                    }
                } catch  {
                    print("讀取數據失敗")
                }
                
            default:
                break
        }
    }
}

  

  

最終,在需要執行【數據持久化】的類,寫上常量的申請(類的對象)

let classCoreData: MyTest = MyTest()

  

然后就可以用以下代碼,愉快的調用了

classCoreData.coreDataAdd("測試寫入")
classCoreData.coreDataDelete("測試刪除")
classCoreData.coreDataUpdate("測試修改")
classCoreData.coreDataSearch("測試讀取")

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM