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 프레임워크의 @Observable 로 class 를 선언한다. 또한 mindLogs 를 [MindLog] 타입으로 선언한다. 또한 preview 전용 persistence 도 isPreview 입력값을 받으면 바뀌게 만들었다.
@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()
}
'→ CoreData' 카테고리의 다른 글
[CoreData] CoreData 시작하기 1 - 개요 (1) | 2024.02.10 |
---|