swift Core Data 簡單使用

語言: CN / TW / HK

小知識,大挑戰!本文正在參與“程式設計師必備小知識”創作活動

1.建立Core Data

建立完後,我們就能看到類似的頁面。

Add Entity,新增一個主體,裡面可以新增響應的屬性,和主體之間依賴關係。我們也可以理解為這是一個類。

2.設定管理和持久化應用物件的類

在appdelegate中建立 NSPersistentContainer

    lazy var persistentContainer: NSPersistentContainer = {
        //名字和Model.xcdatamodeld一樣
        let container = NSPersistentContainer(name: "Model")
        //本地持久化資源的載入
        container.loadPersistentStores { description, error in
            if let error = error {
                fatalError("Unable to load persistent stores: \(error)")
            }
        }
        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)")
            }
        }
    }

顯示持久容器例項包含對託管物件模型、託管物件上下文和連線到應用商店的持久儲存協調器的引用的圖表。

3.新增資料

主要用的是insertNewObject

//    建立一個學生身份
    static func createStudent(name: String, sid: String, age: Int, block:()->Void) {
        //獲取管理的資料上下文 物件
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        // 插入資料
        let stu = NSEntityDescription.insertNewObject(forEntityName: "Student", into: context) as! Student
        let teacher = NSEntityDescription.insertNewObject(forEntityName: "Teacher", into: context) as! Teacher
        teacher.name = "xiaowen"
        teacher.job = "語文"

        stu.name = name
        stu.sid = sid
        stu.age = Int16(age)

        stu.teachBy = teacher

        if context.hasChanges {
            do {
                // 儲存資料
                try context.save()
                print("Insert new stu(\(name)) successful.")
                block()
            } catch {
                print(error)
            }
        }
    }

4.查詢資料

查詢資料用的是NSFetchRequest

 //    查詢學生通過名字
    static func queryStudentWithName(_ name: String ) {
        //獲取管理的資料上下文 物件
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        // 查詢資料
        let fetchStudents = NSFetchRequest<Student>.init(entityName: "Student")
        // 條件查詢
        fetchStudents.predicate = NSPredicate(format: "name = \"\(name)\"")

        do {
            let students = try context.fetch(fetchStudents)
            print("students count = \(students.count)")
            for student in students {
                print("student name = \(student.name!)")
            }
            print("query student:\(name) successful.")
        } catch {

        }
    }

5.修改資料

流程主要是讀取→修改→儲存

//    修改一個學生的名字 讀取→修改→儲存
    static func updateStudentWithName(_ name: String, newName: String) {
        //獲取管理的資料上下文 物件
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        // 查詢資料
        let fetchStudents = NSFetchRequest<Student>.init(entityName: "Student")
        // 條件查詢
        fetchStudents.predicate = NSPredicate(format: "name = \"\(name)\"")

        do {
            let students = try context.fetch(fetchStudents)
            if !students.isEmpty {
                students[0].name = newName
                if context.hasChanges {
                    do {
                        // 儲存資料
                        try context.save()
                        print("Update new Student successful.")
                    } catch {
                        print(error)
                    }
                }
            }
        } catch {

        }
    }

6.刪除資料

流程主要是讀取→刪除→儲存。

 //    刪除一個學生通過名字 讀取→刪除→儲存
    static func deleteStudentWithName(_ name: String) {
        //獲取管理的資料上下文 物件
        let app = UIApplication.shared.delegate as! AppDelegate
        let context = app.persistentContainer.viewContext
        // 查詢資料
        let fetchStudents = NSFetchRequest<Student>.init(entityName: "Student")
        // 條件查詢
        fetchStudents.predicate = NSPredicate(format: "name = \"\(name)\"")

        do {
            let students = try context.fetch(fetchStudents)
            if !students.isEmpty {
                context.delete(students[0])
                if context.hasChanges {
                    do {
                        // 儲存資料
                        try context.save()
                        print("delete \(name) successful.")
                    } catch {
                        print(error)
                    }
                }
            }
        } catch {

        }
    }

gitHub原始碼:https://github.com/wenweijia/CoreDataTest