[SwiftUI] CoreData 사용해보기

RudinP·어제
0

Study

목록 보기
291/292

CoreData 사용 시 있어야할 것

1. CoreDataManager

1-1.싱글톤 매니저

1-2.Container

1-3.mainContext(=viewContext)

1-4.init

1-5.saveContext

1-6.저장,업데이트,삭제 등

1-7.FetchRequest

-> 주의!! 뷰 밖에서는 이걸 사용해도 초기화가 안되기때문에 의미가 없음(저장이 안됨)
-> 사용할 뷰에서 작성해주기
-> 항상 뷰 안에서 사용해주어야 한다는 것을 잊지 말자

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()
        }
    }
}

2. CoreData 내에서의 모델과 동일한 Entity

3. App에서 올바른 PersistanceManager 사용

    let manager = CoreDataManager.shared

    var body: some Scene {
        WindowGroup {
            MainListView()
                .environment(\.managedObjectContext, manager.mainContext)
                .environmentObject(store)
        }
    }

4. 사용할 뷰

	//1-7.FetchRequest
    @FetchRequest(sortDescriptors: [SortDescriptor(\MemoEntity.insertDate, order: .reverse)])
    var memoList: FetchedResults<MemoEntity>
    
    var body: some View {
    ...
    }
 

5. 프리뷰에서 테스트하고자 할 때

#Preview에서 .environment로 추가

#Preview{
 MainListView()
 .environmentObject(CoreDataManager.shared)
 .environment(\.managedObjectContext, CoreDataManager.shared.mainContext)
}
profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글