2011-02-13 2 views
12

안녕 내 응용 프로그램 코어 데이터 모델에는 시트 및 텍스트 엔티티가 있습니다. 시트 엔티티는 두 개의 Text : privacyNotes 및 termsOfUse를 가질 수 있습니다. 텍스트 유형 모두. 따라서 XCode 데이터 모델러에서는 텍스트가있는 시트의 "privacyNotes"및 "termsOfUse"라는 관계를 만듭니다. 다음은 텍스트의 "시트"와 하나가됩니다. 그런 다음 Sheet.privacyNotes의 역수로 Text.sheet 관계를 선택합니다. 여태까지는 그런대로 잘됐다. 그러나 Sheet.termOfUse에 대한 inverse와 같은 Text.sheet 관계를 설정할 때 XCode는이 관계를 반대 Sheet.privacyNotes로 삭제합니다! DB의 관계가 Objective-C 객체 관계와 비교하여 그렇게 간단하지 않을 수 있음을 이해합니다. 그러나 왜 SQLite 또는 (CoreData)가 FEW 관계에 대해 하나의 관계를 역으로 재사용 할 수 없는지 알지 못합니다.코어 데이터 : 동일한 유형의 두 관계에 대한 역 관계

답변

11

추상화 후드에서 약간 엿볼 수 있습니다 * : 관계는 하나의 다른 관계에 대해서만 반대가 될 수 있습니다. 그 이유는 배킹 스토어에서 동일한 데이터로 표현되기 때문입니다. 텍스트와 시트가 특정 관계를 가질 수있는 경우 핵심 데이터는 훌륭한 인간 ​​데이터 모델러가 수행하는 작업을 수행하여 해당 관계를 가능한 간결하게 저장합니다. 엔티티 객체의 관계 속성은 그 관계를 보는 방법 일뿐입니다.

앞으로 무엇을 할 것인가의 효과를 얻으려면 계속 진행하십시오. privacyNote 및 termsOfUse에 대한 시트 속성을 제공하십시오. sheetIAmTermsFor 및 sheetIAmPrivacyNoteFor와 같은 Text 속성을 제공하고이를 반전으로 적절하게 설정합니다. 그런 다음 텍스트 클래스에서,이 라인을 따라 합성 속성을 추가 :

// in interface 
@property (nonatomic, readonly) Sheet *sheet; 
// in impl 
-(Sheet *)sheet 
{ 
    if ([self sheetIAmTermsFor]) 
    return [self sheetIAmTermsFor]; 
    else 
    return [self sheetIAmPrivacyNoteFor]; 
} 

을 너무 세터를 작성하려는 경우, 당신은 세터가되는 코어 데이터 수 (텍스트에 부여해야하는 역할을 결정해야합니다 속성이 두 가지 속성의 반대가 될 수없는 또 다른 이유입니다.)

이 필요하면이 필요합니다. 텍스트는 "privacyNote"또는 " 용어 "그러나 둘 다 결코, 시트의 애플 패턴에 따라 sheetIAmTermsFor 및 sheetIAmPrivacyNoteFor에 대한 세터를 오버라이드하고 설정할 때 다른 속성을 각각 null로 설정하십시오.

(* 애플은 자신의 구현에 비공식적으로 생성되는 SQLite 데이터베이스를 고려하지만 스키마를 검사하는 것은 매우 교육적 일 수 있습니다. CD의 뒤쪽에있는 운송 코드를 직접 작성하여 유추 할 수 있습니다 .)

5

유효성 검사 제한이 2 인 시트와 텍스트 사이의 일대 다 관계를 유지하는 것이 훨씬 낫습니다. 그러면 텍스트에 privacyNotes 또는 termsOfUse으로 선언하는 유형 특성이 있어야합니다. 거기에서 Sheet 서브 클래스에 둘 중 하나를 검색 할 수있는 편리한 메소드를 추가 할 수 있습니다.

+0

네, 그렇지만 시트 편의 메소드는 두 개의 텍스트 엔티티를 유형에 맞게 테스트해야하는데, 이는 약간 낭비가되는 것 같습니다. 우리가 이미 관계를 지시했다면 더 좋을 것입니다, 그래서 당신은 항상'privacyNote'를 먼저두기로 결정할 수 있습니다. –

+1

비슷한 디자인 문제가 발생했습니다. 유형을 저장하는 아이디어는 내가 필요한 것입니다. – Brian

관련 문제