2013-02-12 8 views
2

가 내가있는 NSMutableArray * recordsArray가, 키가 NSStrings가 있으며, 값이 사용자 지정 개체 수 있습니다사용자 정의 객체를 포함하는 NSMutableArray를 저장/보관하는 방법은 무엇입니까?

@interface DictRecord : NSObject{ 
} 
@property (nonatomic, retain) NSString* word; 
@property (nonatomic, retain) NSString *wordStatus; 

코코아 : 저장 방법/I가 있음을 저장하려는 NSMutableArray를 포함하는 사용자 정의

개체를 보관 NSMutable 배열, 바람직하게는 비 - 바이너리 (약간 읽기 쉬운) 형식.

나는 문서를 통해 읽었으며 DictRecord로 인코딩 방법을 추가했습니다 :

- (void) encodeWithCoder: (NSCoder *)coder 
{ 
    [coder encodeObject: _word forKey:@"word" ]; 
    [coder encodeObject: _wordStatus forKey:@"wordStatus" ]; 
} 
- (id) initWithCoder: (NSCoder *) coder 
{ 
    self = [super init]; 
    if (self) { 
     self.word = [coder decodeObjectForKey:@"word"]; 
     self.wordStatus = [coder decodeObjectForKey:@"wordStatus"]; 
} 

그럼 내가 사용하는 저장하려고 :

[recordsArray writeToFile:filePath atomically:YES]; 

파일이 저장되지만 나는 것을 볼 수 있습니다 그것은 비어 있습니다.

누구나 내가 생략 한 단계를 말하거나 내가 잘못했는지 알 수 있습니까?

감사

답변

5

그것은 조금 혼란하지만, NSCoding하고있는 NSArray와 NSDictionary에 속성 목록 방법은 두 개의 분리 된 것들입니다.

  1. 사용 NSCoding :

    당신은 두 가지 선택이있다. 여기 an answer은 배열의 내용에서 호출 된 코딩 메소드를 올바르게 가져 오는 방법을 보여줍니다.

  2. -[NSArray writeToFile:atomically:]을 사용하십시오. -initWithCoder:-decodeWithCoder을 구현하는 대신 -dictionaryValue-initWithDictionary:의 두 가지 방법을 직접 만듭니다. 작성하고, 모델 객체의 배열을 반복하고, 새로운 사전 배열을 만들고, 그것에 -writeToFile:atomically:을 호출합니다. 읽으려면 NSArray 읽기 메소드 중 하나를 호출하고 포함 된 사전을 가져 와서 각각 -initWithDictionary:을 호출하십시오.

사람이 읽을 수있는 plist를 원하면 두 번째 옵션을 선택하는 것이 좋습니다.

+0

감사합니다. noa는 두 번째 방법을 사용하여 작동 시켰습니다. 내가 너를 올바르게 이해했다면, 그것은 데이터 구조를 재산 목록 작성 형식으로 완전히 재구성 한 경우였다. 나는 3 개의 NSString ([0] = key [1] = word [2] = wordstatus)의 각 레코드에 대해 NSArray를 만드는 것이 더 쉬워 보였으므로 이들 사전을 사용하지 않았다. 그것은 저축하고 적재하고, 사람이 읽을 수 있습니다 :) 사전을 사용하는 것이 유익할까요? –

+0

예 : 스키마가 변경되면 새로운 데이터 파일과 오래된 데이터 파일이 여전히 의미가 있습니다. 이니셜 라이저에 기본값을 제공하면 누락 된 값이 기본값을 상속받을 수 있습니다. – paulmelnikow

1

은 - [NSArray를 writeToFile는 : 원자 :] 문서

을 주장이 방법은 재귀 적으로 모든 포함 된 개체는 재산 목록 파일을 쓰기 전에 개체 및 반환 모든 객체는 재산 목록에없는 NO 경우 있는지 확인합니다 객체

속성 목록 파일을 만들고 NSCoder 항목을 불러 오려면 NSKeyedArchiver/NSKeyedUnarchiver를 사용해야합니다.

+0

NSPropertyListSerialization은 옵션이 아닙니까? – paulmelnikow

+0

감사합니다 Ken, [NSArray writeToFile : atomically :]와 함께 작업 할 수 있지만 NSCoder는 없습니다. –

관련 문제