Viblo Code
+3

Tạo một Database Manager trong sử dụng Core Data

Việc sử dụng Core Data trong các dự án iOS đã trở lên rất quen thuộc với các bạn iOS Developers. Hôm nay mình sẽ hướng dẫn các bạn tạo một file manager để làm việc với Core Data. Khi bạn tạo một project có sử dụng Core Data, XCode sẽ sinh ra cho bạn 1 file có tên ProjectName.xcdatamodeld. Bạn tạo các entity trong đó, như: Sau khi tạo xong bạn sẽ gen một class tương ứng để làm việc với entity này: Việc thao tác với class này sẽ cần đến được thực hiện trong suốt quá trình sử dụng app như thêm,sửa,xóa các bản ghi, các trường trong entity và update vào Core Data. Vậy chúng ta cần viết các hàm tương ứng để làm những việc đó, tạm gọi là manager. Để thực hiện việc này bạn cần làm các bước sau:

  1. Trong file User+CoreDataProperties.swift các bạn tạo một extension
extension User {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
        return NSFetchRequest<User>(entityName: "User")
    }

    @NSManaged public var backgroundColor: String?
    @NSManaged public var email: String?
    @NSManaged public var font: String?
    @NSManaged public var passcode: String?

}
  1. Tạo thêm một extension cho các hàm thao tác với entity, gọi là manager
// MARK: - Manager
extension User {
}
  1. Viết các hàm tại đây
// MARK: - Manager
extension User {
    public class func createUser(backgroundColor: String?, email: String?, font: String?, passcode: String?) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let user = User(context:context)
        user.backgroundColor = backgroundColor
        user.email = email
        user.passcode = passcode
        user.font = font
        do {
            try context.save()
        } catch {
            fatalError("Failed saving")
        }
    }
    
    public class func fetchUser() -> User? {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let usersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
        
        do {
            let fetchedUsers = try context.fetch(usersFetch) as! [User]
            return fetchedUsers.first
        } catch {
            fatalError("Failed to fetch employees: \(error)")

        }
    }
    
    public class func updateBackgroundColor(color: String) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let usersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
        
        do {
            let fetchedUsers = try context.fetch(usersFetch) as! [User]
            let user =  fetchedUsers.first
            user?.backgroundColor = color
            try context.save()
        } catch {
            fatalError("Failed to fetch employees: \(error)")
            
        }
    }
    
    public class func updateFont(font: String) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let usersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
        
        do {
            let fetchedUsers = try context.fetch(usersFetch) as! [User]
            let user =  fetchedUsers.first
            user?.font = font
            try context.save()
        } catch {
            fatalError("Failed to fetch employees: \(error)")
            
        }
    }
    
    public class func updatePasscode(passcode: String) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let usersFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
        
        do {
            let fetchedUsers = try context.fetch(usersFetch) as! [User]
            let user =  fetchedUsers.first
            user?.passcode = passcode
            try context.save()
        } catch {
            fatalError("Failed to fetch employees: \(error)")
            
        }
    }
}
  1. Khi cần dùng chúng ra sẽ gọi ra
User.createUser(backgroundColor: "#FB5959", email: "[email protected]", font: "Helvetica-Bold", passcode: "[email protected]")

Tương tự như vậy với các entity khác trong project của bạn cũng sẽ thực hiện và sử dụng như trên. Với cách làm này sẽ giúp cho bạn có thể sử dụng ngay vào các design architecture như MVVM, VIPER...


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.