ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS) Core Data (4) - Entity Hierarchy and Relationship
    iOS 2021. 1. 31. 05:38

    summary

    - Entity 계층 구현 

    - Batch Insert

    - Relationship

    - Data Import

     

     

    Core Data는 두가지 관계를 지원한다.

     

    To - One Relationship: 두 개의 entity가 1대1로 연결된 관계

    To - Many Relationship: 1대 다로 연결되는 관계 

    부서와 직원을 생각해보면 하나의 부서와 여러 직원이 연결되므로 Department가 source라면 Employee를 destination으로 to-many 관계다.

     

    Core Data model에서 Person, Employee, Department 엔티티를 만들고 이들의 관계를 형성하자.

     

    우선 Employee는 Person을 상속하고 Department는 Employee와 To - Many Relationship으로 연결된다.

     

    Employee Entity의 속성창에서 Parent Entity를 Person으로 지정해주면 자동으로 상속된다.

     

    RelationShip을 지정할 땐 To-many relationShip은 이름에 s를 붙히고 반대의 경우 단수로 쓰는게 국룰이다.

     

    Department Entity에서 Employee Entity에 relationship을 생성하고 Type을 To Many로 바꿔준다.

     

    Delete Rule은 관계가 형성 되어있는 다른 Entity를 삭제 할 때 연결되어 있는 entity를 어떻게 처리 할지 정해주는 속성이다.

    - No Action: 아무것도 하지 않는다.

    - Nullify: 삭제된 entity를 null로 바꾼다.

    - Cascade: 연결된 entity를 같이 삭제한다.

    - Deny: 관계가 형성 되어있는 entity 삭제를 거부한다.

     

    대부분 기본값은 nullify이다.

     

    관계란 양방향으로 형성 되어 있는 것이다.

    Department에서 Employee에 접근 할 수 있다면 Employee에서도 Department에 접근 할 수 있어야 한다.

    이는 Inverse 속성을 통해 정해준다.

     

    우선 Employee Entity를 선택한다.

    비어 있던 Relationship에 department 관계를 생성 해준다. inverse를 Destination을 Department로 지정하고 Inverse를 employees로 지정하면 

    Department의 Relationship에 Inverse가 자동으로 추가된다.

     

    위와 같이 설정한다고 Department Entity와 Employee Entity의 관계가 형성 된건 아니다.

    나머지는 직접 코드로 처리해 주어야 한다.

     

    Create NSManagedObject Class를 통해 어떤 기본 메소드가 있는지 보자.

     

    import Foundation
    import CoreData
    
    
    extension DepartmentEntity {
    
        @nonobjc public class func fetchRequest() -> NSFetchRequest<DepartmentEntity> {
            return NSFetchRequest<DepartmentEntity>(entityName: "Department")
        }
    
        @NSManaged public var name: String?
        @NSManaged public var employees: NSSet?
    
    }
    
    // MARK: Generated accessors for employees
    extension DepartmentEntity {
    
        @objc(addEmployeesObject:)
        @NSManaged public func addToEmployees(_ value: EmployeeEntity)
    
        @objc(removeEmployeesObject:)
        @NSManaged public func removeFromEmployees(_ value: EmployeeEntity)
    
        @objc(addEmployees:)
        @NSManaged public func addToEmployees(_ values: NSSet)
    
        @objc(removeEmployees:)
        @NSManaged public func removeFromEmployees(_ values: NSSet)
    
    }
    
    import Foundation
    import CoreData
    
    
    extension EmployeeEntity {
    
        @nonobjc public class func fetchRequest() -> NSFetchRequest<EmployeeEntity> {
            return NSFetchRequest<EmployeeEntity>(entityName: "Employee")
        }
    
        @NSManaged public var salary: NSDecimalNumber?
        @NSManaged public var department: DepartmentEntity?
    
    }
    

     

     

    Department Entity에는 Employee Entity를 추가할 수 있는 메소드가 기본으로 제공 되고 

    Employee Entity에는 프로퍼티로 존재한다.

    var context: NSMangedObjectContext {
    	guard let context = container?.viewContect else { fatalError() }
        return context
    }
    
    let newDepartment = DepartmentEntity(context: context)
    newDepartment = "A Command Center"
    let newEmp = EmployeeEntity(context: context)
    newEmp.name = "Gil Dong Hong"
    newEmp.salary = NSDecimalNumber(integerLiteral: 1000000000)
    newEmp.age = Int16(29)
    newEmp.department = newentity
    newEmp.address = "경기도 성남시 분당구 정자동 13-2"

    댓글

Designed by Tistory.