apple/iOS, UIKit, Documentation

iOS CoreData Relationships

lgvv 2024. 10. 13. 15:41

iOS CoreData Relationships

 

iOS CoreData의 Relationship을 공부해보자.


연관 포스팅

[iOS CoreData 간단한 CRUD](https://rldd.tistory.com/587)

[iOS SwiftData in UIKit](https://rldd.tistory.com/588)

[iOS CoreData 이론](https://rldd.tistory.com/586)

[iOS CoreData Relationships](https://rldd.tistory.com/661)

 

히스토리

  • 2024.10.13
    • CoreData Relationship 정리
  • 2024.12.21
    • CoreData Relationship 패키지 모듈화 정리
    • 샘플 코드에서 Commnutity Package 참고


히스토리

샘플코드

ArchitectureExample.zip
0.62MB

목차

  • 용어정리
  • CoreData Model 만들기 (Subclass, SwiftData)
  • Create
  • Delete

 

 

용어정리

애플 공식문서 이미지 참고

 

Transient

  • Transient란 용어는 프로그래밍 용어라 일시적인이란 의미.
  • Transient는 영구 저장소에 저장되지 않으며, Transient 는 임시로 계산된 값 혹은 파생값을 관리하는데 유용
  • CoreData는 실행 취소 목적으로 Transient 변경 사항을 추적함.

Optional

  • Optional Realtion의 경우에는 detination 타입을 반드시 가지지 않아도 됨.
  • 다만 Required Relation의 경우에는 반드시 하나 이상의 인스턴스를 가져야 함.

Destination

  • Optional Realtion의 경우에는 detination 타입을 반드시 가지지 않아도 됨.
  • 각 Relationship은 source entity(관계를 수정하는 엔티티)에서 destination entity로 향함
  • destination entity는 source entity에 의해서 영향을 받는 타입

Inverse

  • 역 관계로 source 및 destination 타입의 인스턴스가 변경될 때 CoreData가 양방향으로 변경을 전파 할 수 있도록 설정.
  • 모든 Relationship은 Inverse가 있어야 함
  • 각 엔티티에 개별적으로 역 관계를 추가해야 함

Delete Rule

  • CoreData에서 source 인스턴스를 삭제할 때 변경 사항이 Relationship 전체에 영향을 전파되는 방식을 지정
    • NoAction
      • source 인스턴스를 삭제하지만 destination 인스턴스의 reference를 그대로 둠.
      • 이를 수동으로 업데이트 하기 위해서 사용
    • Nullify
      • source 인스턴스를 삭제하고 destination 인스턴스의 reference를 null로 변경
    • Cascade
      • source 인스턴스를 삭제하고 모든 destination 인스턴스도 함께 삭제
    • Deny
      • source 인스턴스를 가리키지 않는 경우에만 source 객체를 삭제
      • 데이터베이스의 트랜잭션 충돌 및 데드락, 특정 권한 유저에게만 제공 등을 위해 사용

Cardinality Type

  • Relationship에 있어서 일대일 혹은 일대다 관계를 지정하고 이를 Cardinality라고 함.
    • Use To One
      • source 인스턴스와 destination 인스턴스를 단일로 연결하려면 To One을 사용
    • Use To Many
      • source 인스턴스와 destination 인스턴스를 1:N으로 연결하고 선택적으로 배열과 count도 제공
    • Arrangement
      • 선택적인 배열 관계를 제공해 순서를 지정할 수 있음.
      • mutable set에서 `orderded`를 선택
    • Count
      • source 인스턴스의 상한 및 하한 갯수 제한을 둘 수 있음.
      • optinal relationship의 경우에는 인스턴스의 수가 0개이거나 상하한 제한 내에 있을 수 있음.
    • Index in Spotlight
      • 스포트라이트에서 사용할 수 있음

 

CoreData Model 만들기 (Subclass, SwiftData)

CoreData에서 DataModel을 아래 형태로 생성

Person
Family

 

 

이미지 처럼 생성할 경우, 아래 이미지 처럼 자동으로 파일이 생성됨.

자동 생성된 엔티티 파일

 

 

이를 수동으로 사용하고 싶을 경우에는

  • Xcode > Editor > Create NSManagedObject Subclass 선택

만약 SwiftData를 사용하고 싶은 경우에는

  • Xcode > Editor > Create Swift Data Code 선택

SwiftData 코드로 자동 생성

 

 

Create

생성할 때 명시적으로 Relationship을 연결해 주어야 함.

let family = FamilyEntity(context: database.context)
family.name = familyName

let person = PersonEntity(context: database.context)
person.name = personName
person.age = Int64(personAge) ?? 0

// ✅ Connect Relationship
family.addToPerson(person)

// ✅ Connect Relationship 
// family.person = person


database.write(family)

 

Delete

Family에 addToPerson이 되어 있으므로

  • Family가 삭제될 때 add 된 Person에게 영향을 미침
  • Person의 Delete Rule에 따라 삭제 방식이 다름

 

 

 

 

 

 

 

 

(참고)
https://developer.apple.com/documentation/coredata/modeling_data/configuring_relationships