Core Data 入門 (2)

Core Data

重構,將方法移動到實體中。在 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 實體所提供的功能即可。
本文網址:https://blog.tonycube.com/2015/10/swift-core-data-2.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。