본문 바로가기

이전 블로그 글

220621 TIL [CoreData 사용 방법 - 3(update & delete)] (블로그 이전 포스팅)

원문 링크

 

이전 게시글에서는 CRUD의 creat와 read에 대해서만 다뤘는데 이번에는 update와 delete에 대해 공부하려고 한다

 

이전 게시글 중 CoreData를 싱글톤으로 사용한 2번 게시물을 기준으로 작성 할 예정이다
(아래 `식별자 지정` 섹션은 업데이트와 삭제를 위해 이전 게시글에서 했던 내용들에 해준 추가 작업이고 그 아래에 작성된 내용이 업데이트와 삭제에 대한 내용

 

식별자 지정

업데이트를 하기 위해서는 코어데이터에 저장할 때 해당 식별자에 맞는 데이터를 업데이트를 해야하는데 이전에 Create, Read만 할때는 그런 식별자에 대한 생각 없이 모델을 만들어 업데이트를 하는데 어려움이 있었다
- storyboard수정

먼저 id를 입력 받을 textField를 추가로 생성 해줬고 업데이트 및 삭제 버튼을 추가

- DataModel 수정

entity에 id프로퍼티를 추가

코어데이터 프로퍼티 파일로 가서 추가한 프로퍼티를 작성

save할 때 값 세팅 부분에 추가

 

- 사용할 곳에서의 수정

저장할 때 사용할 객체 수정

id textField의 숫자를 int로 변환 기능 및 id매개변수 추가

 

프린트 할 내용 추가

 

저장과 읽기가 잘 되는 모습

 

saveContext메서드 구현

 

업데이트와 삭제 기능을 구현하다보니 아래 코드를 자주 사용하게 되었다₩

      do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }

그래서 아래와 같이 따로 메서드를 만들어 이용함

 

    private func saveContext() {
        do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }
    }

Update기능 구현

- CoreDataManer에 updateDate 메서드 추가

func updateDate(textModel: TextModel) {
        //fetchData를 통해 저장된 데이터들 불러오기
        let datas = fetchData()
        
        //데이터들 중 매개변수로 받은 textModel과 id가 동일 하다면 데이터 변경
        for data in datas {
            if data.id == textModel.id {
                data.text = textModel.text
                data.textCount = Int16(textModel.textCount)
            }
        }
        
        //변경된 데이터 저장
        saveContext()
    }

- button touch시 id가 일치하는 데이터 업데이트

@IBAction func touchUpdateButton(_ sender: UIButton) {
        guard let textModel = getText() else {
            return
        }
        
        CoreDataManager.shared.updateDate(textModel: textModel)
    }

Delete기능 구현

 

delete도 data를 수정하는 것이 아니라 삭제한다는 점만 빼면 update와 거의 유사하다

-CoreDataManer에 deleteData 메서드 추가

func deleteData(textModel: TextModel) {
        //fetchData를 통해 저장된 데이터들 불러오기
        let datas = fetchData()
        
        //데이터들 중 매개변수로 받은 textModel과 id가 동일 하다면 데이터 삭제
        for data in datas {
            if data.id == textModel.id {
                context.delete(data)
            }
        }
        
        //삭제 후 context 저장
        saveContext()
    }

- button touch시 id가 일치하는 데이터 삭제

@IBAction func touchDeleteButton(_ sender: UIButton) {
        guard let textModel = getText() else {
            return
        }
        
        CoreDataManager.shared.deleteData(textModel: textModel)
    }

결과