ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SwiftUI Core Data 92 - 데이터 업데이트
    SwiftUI 100 레시피/Core Data 2022. 7. 1. 13:08

    #1. CoreDataManager, updateMovie() 함수 생성

     

     

    import Foundation

    import CoreData

     

    class CoreDataManager{

        

        let persistentContainer: NSPersistentContainer

        

        init(){

            

            persistentContainer = NSPersistentContainer(name: "HelloCoreDataModel")

            persistentContainer.loadPersistentStores{(description, error) in

                

                if let error = error {

                    fatalError("Core Data Store failed to initialize \(error.localizedDescription)")

                }

                

            }

        }

        //Fetch

        func getAllMovies() -> [Movie]{

            

            let fetchRequest: NSFetchRequest<Movie> = Movie.fetchRequest()

            

            do{

               return try persistentContainer.viewContext.fetch(fetchRequest)

                

            } catch {

                return []

            }

        }

        

        //Update

        func updateMovie(){

            do{

                try persistentContainer.viewContext.save()

            } catch{

                persistentContainer.viewContext.rollback()

                print("Failed to save context", error.localizedDescription)

            }

        }

        

        //Delete

        func deleteMovie(movie: Movie){

            persistentContainer.viewContext.delete(movie)

            

            do{

                try persistentContainer.viewContext.save()

            } catch {

                persistentContainer.viewContext.rollback()

                print("Failed to save context", error.localizedDescription)

            }

        }

        

        

        //Save Entity

        func saveMovie(title: String){

            

            let movie = Movie(context: persistentContainer.viewContext)

            movie.title = title

            

            do{

                try persistentContainer.viewContext.save()

                print("Movie saved!")

            } catch{

                print("Failed to save movie", error )

            }

            

            

        }

        

    }

     

    #2. MovieDetail 생성

    import SwiftUI

     

    struct MovieDetail: View {

        

        let movie: Movie

        @State private var movieName: String = ""

        let coreDM: CoreDataManager

        var body: some View {

            VStack{

                

                TextField(movie.title ?? "", text:$movieName).textFieldStyle(RoundedBorderTextFieldStyle())

                Button("Update"){

                    if !movieName.isEmpty{

                        movie.title = movieName

                        coreDM.updateMovie()

                    }

                }

                Spacer()

            }.padding()

        }

    }

     

    struct MovieDetail_Previews: PreviewProvider {

        static var previews: some View {

            

            let coreDM = CoreDataManager()

            let movie = Movie(context: coreDM.persistentContainer.viewContext)

            

            

            MovieDetail(movie: movie, coreDM: coreDM)

        }

    }

     

    #3. ContentView 수정

    import SwiftUI

     

    struct ContentView: View {

        

        let coreDM: CoreDataManager

        @State private var movieName: String = ""

        @State private var movies: [Movie] = [Movie]()

        

        //데이터 가져오기

        private func populateMovies(){

            movies = coreDM.getAllMovies()

            print(movies[0].title!)

        }

        

        var body: some View {

            ////NavigatioView Start

            NavigationView{

                VStack{

                    TextField("Enter movie name", text: $movieName).textFieldStyle(RoundedBorderTextFieldStyle())

                    Button("Save"){

                        coreDM.saveMovie(title: movieName)

                        populateMovies()

                    }

     

                    List{

                        ForEach(movies, id: \.self){ movie in

                            

                            NavigationLink(

                                destination: MovieDetail(movie: movie, coreDM:coreDM),

                                label: {

                                    Text(movie.title ?? "")

                            })

                            

                            

                        }.onDelete(perform: { indexSet in

                            indexSet.forEach{ index in

                                let movie = movies[index]

                                coreDM.deleteMovie(movie: movie)

                                populateMovies()

                            }

                        })

                    }.listStyle(PlainListStyle())

                    Spacer()

                    

                }.padding()

                    .onAppear(perform: {

                        populateMovies()

                    })

            

            }

            ////NavigatioView End

        }

    }

     

    struct ContentView_Previews: PreviewProvider {

        static var previews: some View {

            ContentView(coreDM: CoreDataManager())

        }

    }

     

    수정할 리스트 선택
    수정전

     

    데이터 수정

     

    수정후 Back버튼 누를경우(현재 버그상태로 데이터가 refresh 되지 않음)

     

    댓글

Designed by Tistory.