-> 주의!! 뷰 밖에서는 이걸 사용해도 초기화가 안되기때문에 의미가 없음(저장이 안됨)
-> 사용할 뷰에서 작성해주기
-> 항상 뷰 안에서 사용해주어야 한다는 것을 잊지 말자
import Foundation
import SwiftUI
import CoreData
class CoreDataManager: ObservableObject {
//1-1.싱글톤매니저
static let shared = CoreDataManager()
//1-2.Container
let container: NSPersistentContainer
//1-3.mainContext
var mainContext: NSManagedObjectContext {
return container.viewContext
}
//1-4.init
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "SwiftUIMemo")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
container.viewContext.automaticallyMergesChangesFromParent = true
}
//1-5.saveContext
func saveContext() {
if mainContext.hasChanges {
do {
try mainContext.save()
} catch {
print(error)
}
}
}
//1-6.저장, 업데이트, 삭제 등
func addMemo(content: String) {
let newMemo = MemoEntity(context: mainContext)
newMemo.content = content
newMemo.insertDate = Date.now
saveContext()
}
func update(memo: MemoEntity?, content: String) {
memo?.content = content
saveContext()
}
func delete(memo: MemoEntity?) {
if let memo = memo {
mainContext.delete(memo)
saveContext()
}
}
}
let manager = CoreDataManager.shared
var body: some Scene {
WindowGroup {
MainListView()
.environment(\.managedObjectContext, manager.mainContext)
.environmentObject(store)
}
}
//1-7.FetchRequest
@FetchRequest(sortDescriptors: [SortDescriptor(\MemoEntity.insertDate, order: .reverse)])
var memoList: FetchedResults<MemoEntity>
var body: some View {
...
}
#Preview에서 .environment로 추가
#Preview{
MainListView()
.environmentObject(CoreDataManager.shared)
.environment(\.managedObjectContext, CoreDataManager.shared.mainContext)
}