2010-05-17 6 views
9

코어 데이터를 백엔드로 사용하여 SQLite 레코드를 관리하는 앱을 개발 중입니다. 문자열과 숫자로 작업하는 모든 것이 있지만 BOOL 필드를 추가하려고 시도했지만 작동하지 않는 것처럼 보입니다.코어 데이터 및 BOOL 설정

.xcdatamodel에서 isCurrentlyForSale이라는 개체에 필드를 추가했는데이 필드는 선택 항목이 아닌 일시적 항목이 아니며 인덱싱되지 않았습니다. 속성의 유형은 부울로 설정되고 기본값은 NO입니다. 나는 데이터 모델에서 클래스 파일을 만들 때

는, 상용구 코드가 .H 헤더에이 부동산에 대한 추가했다 다음

@dynamic isCurrentlyForSale; 

과 함께

@property (nonatomic, retain) NSNumber * isCurrentlyForSale; 

하는 .m에 구현 파일.

저는 항상 단순한 BOOL로 부울을 사용했습니다. 나는 NSNumber의 numberWithBool과 메쏘드를 사용할 수 있다고 읽었지 만, 이것은 매우 간단한 무언가를위한 여분의 코드를 많이 쓴 것처럼 보입니다.

헤더의 @property를 간단한 BOOL로 변경할 수 있습니까? 그렇다면 조심해야 할 것이 있습니까?

감사합니다 요한 복음

답변

2

간단한 응답 : 아니, 당신은 BOOL를 반환하는 @property 선언을 변경할 수 없습니다.

간단한 래퍼를 작성할 수 있습니다. 나는 (그것을 currentlyForSalesetCurrentlyForSale:를 생성 의미) currentlyForSale에 속성 이름을 바꾼 다음 두 래퍼를 써서 :

- (BOOL) isCurrentlyForSale { 
    return [[self currentlyForSale] boolValue]; 
} 

- (void) setIsCurrentlyForSale:(BOOL)forSale { 
    [self setCurrentlyForSale:[NSNumber numberWithBool:forSale]]; 
} 
+0

설정자 또는 속성에 "is"가 있어야합니다. 그래서'@ property'는'getter ='설정을 가지고 있습니다. 그리고 네, 핵심 데이터의 일부인 원시 접근자를 사용하여'@ property'를 BOOL로 변경할 수 있습니다. –

+0

@Marcus 네, setter는 그 안에'Is '가 없어야한다는 것을 알고 있습니다.하지만'setCurrentlyForSale :'이 이미 CD에 의해 사용 되었기 때문에 넣었습니다. ('getter ='와'setter ='를 알고 있습니다. 그리고 헤더의'NSNumber * '를'BOOL'으로 바꿀 수 있다는 말입니까?그것은 분명히 놀랄 것입니다. –

30

데이브 드롱의 대답은 가까이 있지만, 실제로의 이름을 변경하지 않고이 작업을 수행 할 수 있습니다 재산.

BOOL을 반환하는 속성을 변경하지만 손으로 ​​접근 메서드를 작성해야하며 Dave의 응답과 약간 다릅니다.

먼저 당신의 @property는 다음과 같이 정의한다 : 대신 @dynamic 속성을 선언, 구현 파일에 다음

@property (nonatomic, getter=isCurrentlyForSale) BOOL currentlyForSale; 

직접 접근을 만듭니다.

- (BOOL)isCurrentlyForSale 
{ 
    [self willAccessValueForKey:@"currentlyForSale"]; 
    BOOL b = [[self primitiveValueForKey:@"currentlyForSale"] boolValue]; 
    [self didAccessValueForKey:@"currentlyForSale"]; 
    return b; 
} 

- (void)setCurrentlyForSale:(BOOL)b 
{ 
    [self willChangeValueForKey:@"currentlyForSale"]; 
    [self setPrimitiveValue:[NSNumber numberWithBool:b] forKey:@"currentlyForSale"]; 
    [self didChangeValueForKey:@"currentlyForSale"]; 
} 

이러한 접근자를 사용하면 개체가 사용자를 위해 복싱을 처리하고 기본 값으로 액세스 할 수 있습니다. 또한 setIs으로 시작하는 설정자는 좋은 생각이 아니므로 예제 코드에서 제거하십시오.

+0

+1 아, 지금 네가하는 말을 듣고있어. 나는 당신이'@ property'를'BOOL'로 변경하고 커스텀 메소드를 구현할 수 없다는 것을 암시한다고 생각했습니다. 옆으로, 세터는 약간 잘못되었습니다. '(will | did) ChangeValueForKey :'는 새로운 값이 실제로 다른 경우에만 호출되어야합니다 (즉, if 문이 필요합니다). –

+0

훌륭한 예와 설명 - Marcus에게 감사드립니다! –

+0

내가 추가 할 유일한 것은 NSString 상수를 키 이름으로 사용하는 것입니다. 나중에 인쇄상의 오류를 해결하는 데 문제가 발생하지 않습니다. NSString * const CurrentlyForSale = @ "currentlyForSale"; ' – Eric