2

코어 데이터 엔티티가 있고이를 "레코드"라고하며, 다른 개체/엔티티의 데이터로 설정해야하는 몇 가지 속성이 있습니다 (관계 설정은 물론). CoreData : 생성 된 엔티티 속성을 올바르게 설정하는 방법

는의는 "기록"은 다음과 같은 특성이 있다고 가정 해 봅시다 :

@interface Record (CoreDataProperties) 

+ (NSFetchRequest<Record *> *)fetchRequest; 

@property (nullable, nonatomic, copy) NSNumber *superRecordID; 
@property (nullable, nonatomic, copy) NSNumber *otherDataID; 
@property (nullable, nonatomic, copy) NSNumber *active; 
@property (nullable, nonatomic, copy) NSDate *createDate; 
@property (nullable, nonatomic, copy) NSDate *updateDate; 
@property (nullable, nonatomic, copy) NSString *uuid; 
@property (nullable, nonatomic, retain) SuperRecord *superRecord; 

@end 

나는 내가 엑스 코드에서와 같은 createDate, updateDate 및 UUID, I와 같은 것들에 대한 1로 기본값을 설정할 수 있습니다, 능동과 같은 것들을 알고 awakeFromInsert 메소드를 오버라이드 (override) 할 수 있습니다.

내 질문은 : 생성시 다른 값과 관계를 설정하는 가장 좋은 방법은 무엇입니까? 내가 알고 있어야한다고 생각할 수있는 유일한 방법은 모든 속성을 설정 한 인스턴스를 작성하는 것입니다.하지만이 작업을 수행 할 수있는 더 나은 방법이 있습니까? 추가 값/객체를 전달하는 곳은 매개 변수이며 생성시 속성/관계를 설정합니다.

답변

1

는 단순히 편의 할당과 같이 쓰기 :

- (instancetype)initWithSuperRecord:(SuperRecord*)superRecord active:(BOOL)active … context:(NSManagdObjectContext*)context 
{ 
    self = [super initWithEntity:… /* in subclasses you typically know that */ 
       insertIntoManagedObjectContext:context]; 
    if(self) 
    { 
    // Set the properties you get from the args 
    } 
    return self; 
} 

+ (instancetype)newWithSuperRecord:(SuperRecord*)superRecord active:(BOOL)active … context:(NSManagdObjectContext*)context 
{ 
    return [[self alloc] initWithSuperRecord:superRecord … context:context]; 
} 

제안을 다음 superID는 최고 기록의 속성이 될 것으로 보인다. 두 번 보관하지 마십시오. 또한 ID가 필요한지 여부를 확인해야합니다. 이것은 OOPish가 아닙니다. 부울 값은 부울 값으로 입력해야합니다. YESNO 또는 @YES@NO 대신 1 및 0을 사용하십시오.

Safari에서 입력했습니다.

+0

ID 필드는 절대적으로 옳았습니다. 전임자가 테이블을 webDB와 일관되게 유지하려고했지만 객체 자체가 OOP 원칙에 더 부합하도록했습니다. 코어 데이터가 내가 방해 할 수있는 많은 것들을 수행하기 때문에 init 메소드를 망칠 필요가 없다고 조언 한 선임 개발자와 이야기하면서이 경로를 피하기로했다. 나는 객체를 만들고 나중에 속성을 설정하기로 결정했습니다. 그러나 귀하의 솔루션을 구현하고 예상대로 작동하여 정확한 답변을 표시합니다. 당신의 도움을 주셔서 대단히 감사합니다! –

+0

그런 식으로 할 수 있습니다. 아무 문제가 없습니다. 그러나 수석 개발자를위한 조언이 있습니다 ;-) CD조차도 Objective-C의 강점 중 * 초기화가 언어 개념이 아니라는 것을 배후에서 많은 일을합니다. 그것은 완전히 언어 외부입니다. Objective-C에서 초기화에 대해 배운 내용은 언어 자체가 아니라 프레임 워크에 의해 정의됩니다. –

+0

따라서 초기화 코드는 프레임 워크의 일부 규칙 (여전히 언어가 아님)이있는 일반적인 코드 일뿐입니다. 초기화는 그 장면 뒤에서 아무것도하지 않습니다. 따라서'-init ... '의 코드는 * normal * 코드입니다. 외부에서 이니셜 라이저로 코드를 변경해도 아무 것도 바뀌지 않지만 여전히 정규 코드입니다. 따라서 초기화에 포함 된 코드와 초기화 내부에있는 코드는 동일하며 각광 또는 장면 뒤에서 어떤 것도 해를 끼칠 수 없습니다. CD는 아무런 차이가 없으므로 일반 코드 나 이니셜 라이저에서 오는 메시지인지 여부조차 모릅니다. –

관련 문제