2012-05-16 7 views
2

최대 길이 값이 40 인 핵심 데이터 엔티티에 문자열 속성이 있습니다. 코드에서이 값을 사용하고 값을 다시 입력하지 않아도됩니다. "40" 이것이 가능한가?코드에서 핵심 데이터 속성 유효성 검사 정보에 ​​액세스하려면 어떻게합니까?

+0

확실한 질문이지만 그럼에도 불구하고 질문해야합니다. 핵심에이 번호를 아는 것이 가장 좋은 해결책이라고 확신합니까? 어쩌면'validateValue : forKey : error :'를 호출하는 것이 효과가 있을까요? –

+0

이 특별한 경우에 값이 잘못된 것인지 확인할 수 있도록 값을 알고 싶지 않습니다. 실제로이 길이의 문자열을 잘라서 유효하게 만들 수 있습니다. –

+0

나는 이것에 대해 100 % 확실하지 않지만, CoreData의 일부분은 독점적 인 코드라고 생각합니다. 답변이 없으므로 동일한 체크를 코드에 쓰고 KVC의 유효성 검사 방법으로 등록하는 것이 좋습니다. –

답변

2

@ K.Steff는 위의 설명에서 코드에서 유효성 검사를하고 핵심 데이터 모델에서 최대 길이를 설정하지 않는 것이 좋습니다. 이 주석에 추가하려면이 엔티티 유형에 대해 사용자 정의 NSManagedObject 서브 클래스를 사용하고 서브 클래스 내에서 validateValue:forKey:error:을 겹쳐 쓰거나이 특성에 대한 키 특정 유효성 검증 메소드를 구현하는 것이 좋습니다.

이 접근법의 가치는 유효성 검사 시간에 문자열을 잘라서 유효성 검사를 "강요하는"것과 같은 일을 할 수 있다는 것입니다. NSManagedObject 문서에서 : 너무 긴 경우 모두 문자열이 필요한 경우, 너무 긴 아니라는 것을 확인에

This method is responsible for two things: coercing the value into an appropriate type for the object, and validating it according to the object’s rules.

The default implementation provided by NSManagedObject consults the object’s entity description to coerce the value and to check for basic errors, such as a null value when that isn’t allowed and the length of strings when a field width is specified for the attribute. It then searches for a method of the form validate< Key >:error: and invokes it if it exists.

You can implement methods of the form validate< Key >:error: to perform validation that is not possible using the constraints available in the property description. If it finds an unacceptable value, your validation method should return NO and in error an NSError object that describes the problem. For more details, see “Model Object Validation”. For inter-property validation (to check for combinations of values that are invalid), see validateForUpdate: and related methods.

그래서이 방법을 구현할 수 있습니다, 그것을 잘라.

1

NSManagedObject에서 entity을 통해 NSEntityDescription에 액세스 할 수 있습니다. 여기서 배열 properties과 사전 propertiesByName을 가져올 수 있으며 그 중 하나는 NSPropertyDescription입니다. 각 속성 설명에는 이라는 속성이 있으며 NSPredicate의 배열을 반환합니다. 그중 하나는 문자열 길이가 최대 40 자 여야한다는 조건이됩니다.

슬픈 표현자를 리버스 엔지니어링하는 데는 많은 번거 로움이 있습니다. 블록을 제공하여 슬픈 정의를 만들면 . 다행히도 NSComparisonPredicate이 있거나 NSCompoundPredicate 또는 NSExpression에서 아래로 걷는 트리로 갈 수는 있습니다.

비교 술어에서 왼쪽 및 오른쪽 식에서 하나가 문자열 길이이고 다른 하나는 상수 값이라는 것을 알 수 있습니다.

그래서, 요약 :

  • 코어 데이터는 술어의 가장 일반적인 수단을 통해 검증 기준을 노출;
  • 일반적으로 항상 그런 것은 아니지만, 술어에서 표현식 (자연 언어 의미로는 NSExpression 의미가 아닌)을 다시 작성할 수 있습니다. 그리고
  • 길이 비교가 필요한 곳을 찾고 계시다면 길이가 포함 된 비교 술어에 대한 트리를보다 쉽게 ​​이해할 수 있습니다.

특정 및 일반의 불일치로 인해 분명히 예쁜 것은 아니지만 가능합니다.

관련 문제