Swift

Swift – Core Data 新增、查詢、刪除、更新

什麼是 Core Data ?

在 iOS(OSX) 應用程式中,要儲存資料可以使用資料庫或檔案,以及現在要介紹的 Core Data,所以 Core Data 的用途就是儲存資料。Core Data 是在 OSX 10.4 及 iOS 3.0 之後開始使用,它可以將物件序列化後儲存在 XML、binary(二位元檔)或 SQLite 資料庫。
Core Data 是一個儲存資料的框架,它的底層本質上還是使用 SQLite 資料庫,它提供簡單易用的方式讓你儲存資料,而不用撰寫複雜的 SQL 語法。如果你的專案有使用 Core Data,可以在該 App 的 Document 目錄中找到 sqlite 檔案。

Managed Object Model


Managed object model 會對應到資料儲存(persistent store)的一組紀錄,這裡的 persistent store 相當於資料庫;
而 Managed object model 即一組紀錄,相當於資料表(table)。

  • NSManagedObjectModel 相當於所有 table 的集合
  • NSPersistentStoreCoordinator 相當於 database(SQLite)

專案設置 : Swift4 + Xcode9


 
Github 範例檔案 : https://github.com/lenny0929/CoreData101
 

Step1. 先新增一個Entity, 叫做Items, 有兩個Attributes, 分別是 name, price 如上圖

Step2. 點選你的Coredata檔案  .xcdatamodeld 後, 從Editor/Create NSManagedObject Subclass …
之後應該會自動生成兩個檔案如下圖

這樣就完成初始專案的建置了

新增一筆CoreData資料


ViewController底下, 新增兩個變數

private var appDelegate = UIApplication.shared.delegate as! AppDelegate
private let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

  透過 appDelegate.saveContext() 即可將資料存到資料庫中


func addItems(name:String, price:Int32) {

    let item = NSEntityDescription.insertNewObject(forEntityName: "Items", into: context ) as! Items
    item.name = name
    item.price = price
    appDelegate.saveContext()
}

其中由Xcode自動生成的儲存函式 AppDelegate.swift中

func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }
        }
    }

 

查詢一筆CoreData資料


來看看剛才新增的 Item 是否有新增成功。加入顯示全部資料的方法:

func showItems() {
        let request = NSFetchRequest<Items>(entityName: "Items" )
        do {
            let results = try context.fetch(request)
            for result in results {
             print("Items Name: \(result.name!), Price: \(result.price)")
            }
        }catch{
            fatalError("Failed to fetch data: \(error)")
        }
    }

然後在原本新增產品的後面加入此方法:

self.addItems(name: "iPhoneX 64GB", price: 32900)
showItems()

console應該會打印出

Items Name: iPhoneX 64GB, Price: 32900

刪除一筆CoreData資料


func cleanItems() {
       let request = Items.fetchRequest() as NSFetchRequest<Items>
        // 透過 predicate 將iPhoneX 找出來
        let item_name = "iPhoneX 64GB"
        request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", item_name)
        do {
            let iphoneXs = try context.fetch(request)
            for iphoneX in iphoneXs {
                // 刪除一個 NSManagedObject
                context.delete(iphoneX)
            }
            // 刪除後記得儲存Context
            appDelegate.saveContext()
            
        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    }

更新一筆CoreData資料


更新資料一樣需要先將該資料取出, 更改後, 在儲存資料即可

func updateItems() {
        let request = Items.fetchRequest() as NSFetchRequest<Items>
        // 將iPhoneX 找出來
        let item_name = "iPhoneX 64GB"
        request.predicate = NSPredicate(format: "name CONTAINS[cd] %@", item_name)
        do {
            let iphoneXs = try context.fetch(request)
            if (iphoneXs.count > 0){
                let product = iphoneXs[0]
                product.price = 20000
                appDelegate.saveContext()
            }
        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }
    }

以上就是CoreData 最基本的操作
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *