티스토리 뷰

https://modelinspring.tistory.com/92

 

[Swift/iOS] CoreData 사용하기(3) - 데이터 저장하기, 데이터 불러오기 기초

https://modelinspring.tistory.com/91 [Swift/iOS] CoreData 사용하기(2) - CoreData Stack 설정하기 From 공식문서! 공식문서를 참고한 글입니다.https://developer.apple.com/documentation/coredata/setting_up_a_core_data_stack https://mode

modelinspring.tistory.com

위 포스트에 이은 CoreData 네 번째, 마지막 포스트입니다.

 

이전 포스팅에서는 Object에 값을 채운 후 데이터를 저장했습니다.

 

모든 값이 채워지지 않은 Object를 저장하면 어떻게 될까요?

nil이 포함된 저장

car.setValue(myCar["brand"], forKey: "brand")
// car.setValue(myCar["color"], forKey: "color")
car.setValue(myCar["price"], forKey: "price")

위와 같은 코드로, 일부 값을 비워서 저장해보겠습니다.

value를 주지 않고 저장하면, 해당 값이 nil로 들어가게 된 것을 알 수 있습니다.

 

Entity의 속성의 optional 유무

그럼 Entity의 속성들은 기본적으로 optional일까요?

guard let newcar = try? context.fetch(Car.fetchRequest()) else { return }
newcar.forEach {
    print($0.brand, $0.color, $0.price)
    print(type(of: $0.brand))
    print(type(of: $0.color))
    print(type(of: $0.price))
}

brand와 colors는 optional로, price는 Int64로 확인할 수 있습니다.

 

그럼 이번에는 price 값을 주지 않고 저장해보겠습니다.

        car.setValue(myCar["brand"], forKey: "brand")
        car.setValue(myCar["color"], forKey: "color")
//        car.setValue(myCar["price"], forKey: "price")


nil이 아니라 0이 들어가있는 것을 알 수 있습니다.

아무런 설정을 하지 않는다면, 현재 String 속성은 optional로, Int64는 non-optional인 것을 알 수 있습니다.

optional 설정하기

사실은 Data Model 파일에서 Entity의 Attribute를 클릭한 후, 인스펙터 창을 확인하면 optional 여부를 설정할 수 있습니다.

인스펙터 창에서는 옵셔널 여부와 Default 값도 설정해줄 수 있습니다.

Integral64는 현재 optional로 설정되어있지만 기본 값이 0으로 설정되어 있습니다.

기본 값을 삭제하고 테스트해보겠습니다.(No Value)

0이 기본값으로 들어가고, 여전히 Int64로 타입으로 확인됩니다.

 

optional도 해제하고 저장해보겠습니다.

에러가 발생하는 것을 확인할 수 있습니다.

속성값이 non-optional 일때, 값이 전달되지 않으면 오류가 발생합니다.

 

그리고 저장된 데이터들 중에 nil이 있다면, 이후에 속성 값을 non-optional로 설정하면 역시 오류가 발생합니다.

 

속성 타입을 잘 관리해야 나중에 오류를 피할 수 있습니다.

댓글