[APP開發-使用Swift] 19–1. 修改為Core Data 架構

這篇文章將以上次我們開發的「我的餐廳」App為基礎,依照我們上次說明的Core Data架構,將餐廳儲存到資料庫中,並從資料庫取出。

  1. 使用Core Data 模板:Xcode其實已內建了Core Data模板,在專案一開始建立的時候,勾選Core Data,系統就會自動在AppDelegate.swift產生好Core Data程式碼。既然我們現在希望的是將現有的架構修改為Core Data,我們可以另外建立一個Core Data專案,再將AppDelegate程式碼複製過來。

打開AppDelegate.swift,先加入:

import CoreData

再加入以下程式碼,並記得替換專案名稱:

// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentContainer = {
// 記得替換專案名稱
let container = NSPersistentContainer(name: "FoodPin")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
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)")
}
}
}

接下來就可以開始建立我們的Model。

2. 選擇New File → Data Model,新增FoodPin.xcdatamodelId檔案

3. 點選Add Entity,新增一個Restaurant Entity,再將每個Attribute加上,包含name, type, location, image, isVisited, rating。將isVisited Type設為Boolean,image設為Binary Data,其他均為String。

4. 將name、type、location的Properties Optional打勾移除,我們將這三個欄位設為Required。

5. 接著選擇Entity Restaurant,將Class Name = RestaurantMO,Codegen = Class Definition。

6. 我們原先將我們的餐廳放在記憶體裡,現在得修改為Core Data。

  • 打開RestaurantTableViewController.swift ,修改以下

var restaurants: [RestaurantMO] = []

cell.thumnailImageView.image = UIImage(data: restaurants[indexPath.row].image! as Data)

let defaultText = "在" + self.restaurants[indexPath.row].name! + "打卡"

  • RestaurantDetailViewController.swift

var restaurant: RestaurantMO!

restaurantImageView.image = UIImage(data: restaurant.image! as Data)

  • MapViewController.swift

var restaurant: RestaurantMO!

geoCoder.geocodeAddressString(restaurant.location!, completionHandler: { placemarks, error in

7. 執行看看,出現空白表格,沒有錯誤就表示修改成功囉!

>>>19–2. Core Data 新增