重構,將方法移動到實體中。在 Core Data 入門(1) 的範例中,我們把對資料庫動作的所有程式都寫在 ViewController 裡面,這樣的做法不太好,既然這些動作和 Product 實體有關,那就應該放在它自己身上,任何對 Product 的動作一律由它來處理。
將原本在 ViewController 中的大多數程式碼移到 Product.swift 裡:
class Product: NSManagedObject {
static let entityName = "Product"
class func add(moc:NSManagedObjectContext, name:String, price:Int) {
let product = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext: moc) as! Product
product.name = name
product.price = price
do {
try moc.save()
}catch{
fatalError("Failure to save context: \(error)")
}
}
class func getAll(moc:NSManagedObjectContext) -> [Product] {
let request = NSFetchRequest(entityName: entityName)
do {
return try moc.executeFetchRequest(request) as! [Product]
}catch{
fatalError("Failed to fetch data: \(error)")
}
}
class func findByName(moc:NSManagedObjectContext, name:String) -> Product? {
let request = NSFetchRequest(entityName: entityName)
request.predicate = NSPredicate(format: "name == %@", name)
do{
let results = try moc.executeFetchRequest(request) as! [Product]
if (results.count > 0){
return results[0]
}
} catch {
fatalError("Failed to update data: \(error)")
}
return nil
}
class func cleanUp(moc:NSManagedObjectContext) {
let request = NSFetchRequest(entityName: entityName)
do {
let results = try moc.executeFetchRequest(request) as! [Product]
for result in results {
moc.deleteObject(result)
}
do {
try moc.save()
}catch{
fatalError("Failure to save context: \(error)")
}
}catch{
fatalError("Failed to delete data: \(error)")
}
}
}
這樣原本的 ViewController 就可以直接呼叫這些方法來使用。ViewController.swift
class ViewController: UIViewController {
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
override func viewDidLoad() {
super.viewDidLoad()
Product.cleanUp(moc)
Product.add(moc, name: "iPhone 6s 16GB", price: 24500)
Product.add(moc, name: "iPhone 6s 64GB", price: 28500)
Product.add(moc, name: "iPhone 6s 128GB", price: 22500)
self.updateProductPrice()
self.showProducts()
}
func showProducts() {
let products = Product.getAll(moc)
for product in products {
print("Product Name: \(product.name!), Price: \(product.price!)")
}
}
func updateProductPrice(){
if let product = Product.findByName(moc, name: "iPhone 6s 128GB") {
product.price = 32500
do{
try self.moc.save()
} catch {
fatalError("Failed to update data: \(error)")
}
}
}
}
完成。這樣就將責任劃分清楚了,所有要對 Product 實體做的動作,全都由 Product 來處理,ViewController 或其它類別只需要呼叫 Product 實體所提供的功能即可。
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。