[APP開發-使用Swift] 19–1. 修改為Core Data 架構
這篇文章將以上次我們開發的「我的餐廳」App為基礎,依照我們上次說明的Core Data架構,將餐廳儲存到資料庫中,並從資料庫取出。
- 使用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. 執行看看,出現空白表格,沒有錯誤就表示修改成功囉!