2014-05-22 1 views
1

기존 코어 API (Xcode 5, Mavericks, iOS 7.1+)로 기존 iOS 앱을 이식하고 있습니다. 기존 sqlite3 데이터베이스를 가져와야합니다. 모델 파일을 자동 생성하고 데이터베이스의 데이터로 채 웁니다. 그런 다음xcode 코어 데이터 클래스의 데이터 형식이 일치하지 않습니다.

@implementation Details 

@dynamic heightInches; 
… 

:

@interface Details : NSManagedObject 

@property (nonatomic) float heightInches; 
… 

자동 생성이 속성을 구현합니다

나는 스칼라 유형 (자동 생성 때 내가 사용 스칼라 상자를 선택)이 포함 된 자동 생성 된 클래스가 데이터베이스에서 부동 소수점을 사용하여이 속성 값을 설정하려고합니다 :

Details* details = [NSEntityDescription insertNewObjectForEntityForName:@“Details” inManagedObjectContext:context]; 
[details setHeightInches:(float)sqlite3_column_double(statement, 10)]; 
… 

Whe 내가 구현 재정 만약 내가 같은 런타임 오류가

'NSInvalidArgumentException', reason: 'Unacceptable type of value for attribute: property = "heightInches"; desired type = NSNumber; given type = NSManagedObject; value = (entity: Details; id: 0x1002286a0 ; data: { heightInches = 0; …

: N이 줄을 내가 다음과 같은 런타임 오류가 실행

@synthesize heightInches; 

을 그리고 난 (컴파일시 오류 유형 불일치) 내가 대신 부동의의 NSNumber를 전달하려고하면 : 데이터 형식이 떠있을 때

[details setHeightInches:[NSNumber numberWithFloat:(float)sqlite3_column_double(statement, 10)]]; 

왜 코어 데이터가의 NSNumber 기대합니까? 코어 데이터가 NSManagedObject로 전달하는 float을 왜 보는가? int32_t 값이 작동하는 것 같습니다. 수레를 위해해야 ​​할 특별한 것이 있습니까?

감사

+0

스칼라 유형을 버리고 NSNumber로 변경할 수 있습니까? – danh

+0

예. 나 자신의 게터와 세터를 쓰자. 나는 게임의 초기에 몇 가지 핵심 데이터 이점을 포기하는 것에 저항한다. –

+1

Gotcha. 그러나 핵심 데이터 이점은 숫자 대신 객체를 표현할 수 있다는 것입니다. NSNumber의 장점 중 하나는 별개의 상태로 nil (대 0.00)을 얻는 것입니다. – danh

답변

1

나는 다소 반대 의견 접근을하려고하면 나쁜 디자인 결정도 물건이 방법을 시도하고 있습니다 있기 때문에를 중요하지 않습니다 주장하고있다.

의견에 과학적 데이터라고 언급되어 있습니다. 그러나 이것을 float에 할당하면 부동 소수점 변수에 10 진수 값을 나타내는 일반적인 문제로 인해 정밀도가 떨어집니다.

대신 데이터 모델의 속성을 Decimal으로 선언해야합니다. NSDecimalNumber으로 표시 될 하위 클래스를 생성 할 때 (스칼라 함수가 없으므로 해당 확인란을 선택해도 아무런 차이가 없습니다). NSDecimalNumber은 분명 완벽하지는 않지만 10 진수 값을 갖고 정확도 (예 : 과학, 금융)를 중요하게 생각하는 경우 올바른 선택입니다.

사실이 경우 잘못되는 부분은 완전히 확실하지 않습니다. setHeightInches을 사용하면이 제대로 작동해야합니다. 귀하의 오류 메시지는 귀하의 질문에있는 세부 사항보다 더 많은 일이 있음을 암시합니다. float 대신에 NSNumber을 원한다고 불평하지 않기 때문입니다. 값으로 NSManagedObject을 받았다고 불평하지만 코드 스 니펫에는 표시되지 않습니다. float이 여전히이 상황에서 잘못된 선택이기 때문에 그것은 중요하지 않습니다.

관련 문제