→ CoreData

[CoreData] CoreData 시작하기 3 - Manager 생성하기 (CRUD)

Swift librarian 2024. 2. 10. 10:13

1. CoreDataManager 생성

이제 Persistence 까지 만들어 주었으니 CoreDataManager 를 만들어 줄 차례이다. 이름은 원하는대로...

import CoreData

@Observable final class CoreDataManager {
    let persistence: Persistence
    var mindLogs: [MindLog] = []
    
    static let shared = CoreDataManager()
    static let preview = CoreDataManager(isPreview: true)
    
    private init(isPreview: Bool = false) {
        if isPreview {
            persistence = Persistence.preview
        } else {
            persistence = Persistence.shared
        }
        fetch()
    }
    
    func fetch() {
        let request = NSFetchRequest<MindLog>(entityName: "MindLog")
        
        let sort = NSSortDescriptor(keyPath: \MindLog.date, ascending: false)
        request.sortDescriptors = [sort]
        
        do {
            mindLogs = try persistence.context.fetch(request)
        } catch {
            print("Fetch error")
        }
    }
    
    func add(date: Date, score: Double, note: String) {
        let mindLog = MindLog(context: persistence.context)
        mindLog.id = UUID()
        mindLog.date = date
        mindLog.score = score
        mindLog.note = note
        
        save()
        fetch()
    }
    
    func delete(mindLog: MindLog) {
        persistence.context.delete(mindLog)
        
        save()
        fetch()
    }
    
    func update(mindLog: MindLog, date: Date, score: Double, note: String) {
        mindLog.date = date
        mindLog.score = score
        mindLog.note = note
        
        save()
        fetch()
    }
    
    func save() {
        do {
            try persistence.context.save()
        } catch {
            print("Save error")
        }
    }
}

 

2. CoreDataManager 코드 자세히 보기

 

Class 선언

새로 나온 Observation 프레임워크의 @Observableclass 를 선언한다. 또한 mindLogs [MindLog] 타입으로 선언한다. 또한 preview 전용 persistenceisPreview 입력값을 받으면 바뀌게 만들었다.

@Observable final class CoreDataManager {
    let persistence: Persistence
    var mindLogs: [MindLog] = []
    
    static let shared = CoreDataManager()
    static let preview = CoreDataManager(isPreview: true)
    
    private init(isPreview: Bool = false) {
        if isPreview {
            persistence = Persistence.preview
        } else {
            persistence = Persistence.shared
        }
        fetch()
    }
    ...
}

 

fetch()

NSFetchRequest 를 사용하여 Minding.date 를 기준으로 내림차순 (ascending: false) 정렬한다. do try catch 를 활용하여 context.fetch(request) 를 작업한다.

    func fetch() {
        let request = NSFetchRequest<MindLog>(entityName: "MindLog")
        
        let sort = NSSortDescriptor(keyPath: \MindLog.date, ascending: false)
        request.sortDescriptors = [sort]
        
        do {
            mindLogs = try persistence.context.fetch(request)
        } catch {
            print("Fetch error")
        }
    }

 

save()

항상 선언해주는 함수인데 context.save() 를 작업한다.

    func save() {
        do {
            try persistence.context.save()
        } catch {
            print("Save error")
        }
    }

 

add()

date, score, note 를 입력받아 persistence.context 에 추가해준다.

    func add(date: Date, score: Double, note: String) {
        let mindLog = MindLog(context: persistence.context)
        mindLog.id = UUID()
        mindLog.date = date
        mindLog.score = score
        mindLog.note = note
        
        save()
        fetch()
    }

 

delete()

mindLog 입력값을 받아 context.delete() 를 수행한다.

    func delete(mindLog: MindLog) {
        persistence.context.delete(mindLog)
        
        save()
        fetch()
    }

 

update()

mindLog 를 받아서 입력받은 date, score, note 를 넣어준다.

    func update(mindLog: MindLog, date: Date, score: Double, note: String) {
        mindLog.date = date
        mindLog.score = score
        mindLog.note = note
        
        save()
        fetch()
    }