[!CoreData] 앱의 영속적인 데이터를 저장 임시 데이터를 캐싱 단일 장치에서 앱에 undo 기능을 추가할 수 있도록 함

Persistence

CoreData는 객체를 저장소에 매핑하는 세부 정보를 추상화 합니다. 이는 데이터베이스를 직접 관리하지 않고 Swift, Objective-C에서 데이터를 쉽게 저장할 수 있도록 합니다.

[[CoreDataStack]]

NSPredicate

[!Note] fetch 혹은 in-memory 필터링 검색을 제한하는데 쓰이는 논리적 조건의 정의 즉, 검색을 제한(필터링)하기 위해 사용한다.

public convenience init(format predicateFormat: String, _ args: any CVarArg...)

initialize할 때 format을 정해줄 수 있습니다. 이는 검색 조건을 정해주는 것을 의미합니다. 예를 들어 NSPredicate(format: "retrospect == %@", self) 이라면 retrospect 속성이 %@self 와 같다는 것을 의미하여

Codegen

Save

guard let entity = NSEntityDescription.entity(
            forEntityName: "PhoneBook",
            in: container.viewContext
        ) else { return }

        let person = NSManagedObject(entity: entity, insertInto: container.viewContext)
        person.setValue("메모입니다.", forKey: "memo")
        person.setValue("문영균", forKey: "personName")
        person.setValue("010-1234-5678", forKey: "phoneNumber")

        do {
            try container.viewContext.save()
        } catch {
            print(error.localizedDescription)
        }

@IBAction func save() {
        guard let entity = NSEntityDescription.entity(
            forEntityName: "PhoneBook",
            in: container.viewContext
        ) else { return }

        let person = NSManagedObject(entity: entity, insertInto: container.viewContext)
        person.setValue("메모입니다.", forKey: "memo")
        person.setValue("문영균", forKey: "personName")
        person.setValue("010-1234-5678", forKey: "phoneNumber")

        do {
            try container.viewContext.save()
        } catch {
            print(error.localizedDescription)
        }
    }

    @IBAction func fetch() {
        do {
            guard let contact = try container.viewContext.fetch(PhoneBook.fetchRequest()) as? [PhoneBook] else { return }
            contact.forEach {
                print($0.personName ?? "")
                print($0.phoneNumber ?? "")
                print($0.memo ?? "")
            }
        } catch {
            print(error.localizedDescription)
        }
    }

    @IBAction func deleteAll() {
        let fetchRequest = PhoneBook.fetchRequest()
        let items = try? container.viewContext.fetch(fetchRequest)
        for item in items ?? [] {
            print(item)
            container.viewContext.delete(item)
        }
        try? container.viewContext.save()
    }