ViewModel부터 시작해서 처음부터 CoreData를 만드는 걸 해보자
뷰모델을 만들어주고, container를 선언한 후에 init에서 마무리해줌
그리고 FruitsContainer 데이터모델을 만들어줌
FruitsContainer를 방금만들어준 모델의 이름으로 설정해줌
이상태에서 빌드해서 실행해보면 제대로 로드가 되는 걸 볼 수 있음
그리고 뷰모델 안에서 fetch메소드를 작성해줌
request는 NSFetchRequest이고 entity이름은 FruitEntity 그리고 제네릭 타입은 FruitEntity 로
그리고 request를 fetch한 후에 @Published로 선언한 savedEntities 에 담아줌
그다음은 init에서 fetchFruits를 호출해주면 됨
add 해주는 메소드를 작성해주는데 add될 때마다 container에 저장이 되어야함!
saveData메소드를 작성해주고, container에 저장되는 시점에 viewModel의 savedEntities에 다시 저장이 되어야하니까 fetchFruits()도 호출해줌
그러니까 fetchFruits()는 저장된 container를 토대로 entity를 뷰모델에 저장해주고,
addFruit은 새로운 text를 받아서 new FruitEntity를 만든 후에 save해줌
save 할 때엔 savedEntities도 업데이트 되어야하니까 fetchFruits() 해주고
struct CoreDataBootcamp: View {
@StateObject var vm = CoreDataViewModel()
@State var textFieldText: String = ""
var body: some View {
NavigationView {
VStack(spacing: 20) {
TextField("Add fruit here...", text: $textFieldText)
.font(.headline)
.padding(.leading)
.frame(height: 55)
.background(Color.gray.opacity(0.25))
.cornerRadius(10)
.padding(.horizontal)
Button {
guard !textFieldText.isEmpty else { return }
vm.addFruit(text: textFieldText)
textFieldText = ""
} label: {
Text("Button")
.font(.headline)
.foregroundColor(.white)
.frame(height: 55)
.frame(maxWidth: .infinity)
.background(Color.accentColor).cornerRadius(10)
.padding(.horizontal)
}
List {
ForEach(vm.savedEntities) { entity in
Text(entity.name ?? "No Name")
}
}
}
.navigationTitle("Fruits")
}
}
}
텍스트필드에 텍스트를 입력하고 버튼을 누르면 리스트로 출력이 되게끔 만들어줌
delete이랑 update도 만들 수 있겠죠