2010-07-31 7 views
2

기존 프로젝트에서 프로젝트가 생성 된 후 오랫동안 핵심 데이터를 도입하려고 시도 했으므로 모델이 이미 마련되어 있습니다. xcdatamodel을 생성하고 거기에 유일한 클래스를 추가했습니다. 해당 클래스는 내 애플리케이션의 개체에 대한 전역 저장소 역할을해야합니다. 클래스가 NSManagedObject를 제대로 구현하고 있으며 가져온 결과와 함께 가져온 컨텍스트에서 생성되고 저장된다는 것을 확인했습니다.NSManagedObject 이해하기

이 클래스에서 데이터를 저장하는 방법은 NSMutableArray를 사용합니다. 그러나 이것은 단지 작동하지 않습니다.

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context { 
NSLog(@"init with entity"); 
[super initWithEntity:entity insertIntoManagedObjectContext:context]; 

return [self init]; 
} 

init 메소드 만 변경 가능한 배열을 초기화하고, 내가 그 로그에서 볼 수 있습니다

@interface WZMPersistentStore : NSManagedObject<NSCoding> { 
NSMutableArray *persistentStorage; 
} 

@property(nonatomic,retain) NSMutableArray *persistentStorage; 

-(void)add:(id)element; 
-(void)remove:(id)element; 
-(id)objectAtIndex:(NSUInteger)index; 
-(NSUInteger)num; 

@end 

구현에서 나는 또한이 같은 initWithEntity를 오버라이드 (override) : 다음은이 클래스의 단편입니다 엔티티를 만들 때 앱 대리인이 제대로 호출합니다. add 메소드는 메시지 insertObject를 persistentStorage에 보냅니다. 여기에서 오는 질문 :

  1. "개념적으로"올바르게하고 있습니까? 나는 을 의미합니다. 변수를 관리 객체에 넣고 을 초기화하는 것이 맞습니까? persistentStorage의 크기를 기록 NS 난 항상 얻을
  2. 0 addObject 메시지 후 순간을 기록에도 (편집 : 즉, 나는 다시 확인하고 난 정확히 1이 추가 얻었다 사실이 아니다 의)을.
  3. 관리 대상 객체 에 저장되는 객체 trough persistentStorage는 속성이있는 일반 클래스 입니다. 거기에 와 (과) 어떤 관련이 있나요? 내가 런타임에 오류가 발생하지 않기 때문에 나는 아니 겠지.
+0

나는 정말 필사적이다. : - | – Leonardo

답변

0

마침내이 문제를 해결할 수있었습니다. 객관성 -c에서 초보자 일지라도 프로젝트가 끝나면 핵심 데이터를 도입하는 것이 좋은 생각이 아닙니다. 많은 사람들이 쉽게 주장합니다. 불행히도, 그렇게 말하는 모든 사람들은 하나의 문자열 속성을 가진 하나의 엔티티에 대한 아주 간단한 튜토리얼을 증거로 제시하고 있습니다. 대신 내 프로젝트를 위해 기존 모델 외에도 많은 코드를 작성하고 원래 모델을 손상시키는 서브 클래 싱 (NSManagedObject)을 추가했습니다. 이 추가 된 코드는 신중하게 작성해야합니다. 파생 된 문제는 저장되지 않은 속성만큼이나 간단하거나 잘못된 엔티티를 삭제하는 것처럼 위험 할 수 있습니다.

Infact, 내 문제는 직렬화 과정에 관련된 클래스의 디코딩 및 인코딩 방법에서 잘못된 구성으로 인한 것입니다. 내가 목표 - C

N'- 포인트 두 가지에 아직 확신하지이기 때문에 내가 관련 오브젝트 코드/코드 몇 가지 문제가 있었다 말했듯이

N'- 포인트 중 하나는 여전히, 답이 남아 : 내 질문

.

-Point 3 점, 잘못되었습니다. 관련 클래스가 얼마나 복잡한가에 따라 많은 코드를 작성해야합니다.

2

아니요, 이는 "올바른"방식이 아닙니다. 인스턴스 변수의 초기화는 awakeFromFetch에서 수행 할 수 있습니다.

또한 initWithEntity:insertIntoManagedObjectContext:, dealloc, 또는 finalize를 오버라이드 (override) 에서 낙심 : NSManagedObject 하위 클래스에 대한 애플의 가이드 라인은 다음과 같습니다. 을 initWithEntity:insertIntoManagedObjectContext: 방법으로 변경하면 컨텍스트가 표시되지 않으므로주의하지 않으면 변경 사항이 저장되지 않을 수 있습니다. 대부분 초기화 사용자 정의 깨어있는 중 하나에서 수행되어야합니다 ... 방법. 재정의 할 경우 initWithEntity:insertIntoManagedObjectContext:, 당신이 방법 설명에 명시된 요구 사항을 준수 확인해야합니다 [...] (NSManagedObject Class Reference)

정말 도움하려면 , 나는 깊은 이해를 필요 했어 당신이 성취하고자하는 것의 그럼에도 불구하고 진행하기 전에 Apple의 Core Data Programming Guide과 샘플 코드를 섞어서 사용하는 것이 좋습니다.