문제

NSObject에서 상속하는 사용자 정의 객체가 있습니다. 3 명의 멤버가 있습니다 - 2 개의 수레와 an NSDate.

내 앱에는 이러한 객체가 여러 개를 차는 배열이있는 배열이 있으며, 실행 사이에 유지해야합니다. 이것을 어떻게 달성 할 수 있습니까?

나는 sqlite db를 사용하는 것에 대해 생각했지만, 내가 할 수있는 유일한 쿼리가 이후 약간 과잉이라고 생각합니다. select *.

이상적인 세상에서는 XML PLIST 파일을 사용하고 싶습니다. 그래도 내 커스텀 객체 로이 작업을 수행 할 수 있는지 확실하지 않습니다. 속성 목록 개체 세트가 있다는 것을 알고 있습니다. NSArray 그 아래에 나옵니다 writeToFile:atomically: 속성 목록 객체와 만 작동합니다.

모든 생각이 감사하겠습니다. 감사합니다!

도움이 되었습니까?

해결책

NSCoding 당신이 원하는 것을 정확히 할 것입니다. Apple Docs에서 읽는 것이 좋습니다. 그러나 사용하기가 매우 간단하다고 생각했습니다. 귀하의 수업 (및 모든 어린이 수업)은 NSCoding 프로토콜을 추가해야합니다 -encodeWithCoder: 그리고 -initWithCoder: 당신의 대상에 대한 방법. 대부분의 공통 프레임 워크 클래스가 구현됩니다 NSCoding 이미.

수업의 코드는 다음과 같습니다.

-(void) encodeWithCoder: (NSCoder*) coder {
  [coder encodeInteger: versionValue forKey: versionKey];
  [coder encodeObject: myStuff forKey: myStuffKey];
}

-(id) initWithCoder: (NSCoder*) coder {
  self = [super init];
  if ( ! self) return nil;
  myStuff = [[coder decodeObjectForKey: myStuffKey] retain];
  return self;
}

인코딩 할 때 버전 번호를 추가하여 향후 버전에서 아카이브 형식의 변경 사항을 관리 할 수있는 유연성을 제공하는 것이 좋습니다.

수업 시간에 나는 내 객체를 보관하기위한 편리한 방법을 추가했습니다.

-(void) archiveToFile: (NSString*) path {
  NSMutableData *data = [[NSMutableData alloc] init];
  NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data];
  [archiver encodeObject: self forKey: myArchiveKey];
  [archiver finishEncoding];
  [archiver release];
  [data writeToFile: path atomically: YES];
  [data release];
}

그리고 다른 하나는 미묘하거나 새 객체를 만들기위한 것입니다.

+(MyArchive*) newFromFile: (NSString*) path
            orWithMyStuff: (MyStuff*) myStuff
{
  NSData *data = [[NSData alloc] initWithContentsOfFile: path];
  NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data];
  MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey];
  [unarchiver finishDecoding];

  if (myArchive) {
    [myArchive retain];
  } else {
    myArchive = [[MyArchive alloc] initWithStuff: myStuff;
  }
  [unarchiver release];
  [data release];
  return myArchive;
}

최상위 객체는 an입니다 NSArray, 사례의 마지막 두 가지 방법을 수정해야하지만 대부분의 보일러 플레이트 코드는 동일합니다.

다른 팁

객체의 서브 세트를 검색하려면 SQLite가 최선의 선택입니다.

그렇지 않다면 Plist 형식과 NSCoding 중에서 선택합니다. Plist는 사용자 정의 객체를 Plist 친화적 인 것으로 변환 한 다음 Plist를 객체로 다시 변환 할 수 있어야하지만 NSCoding은 머리를 감싸기가 어렵고 손으로 쉽게 편집 (또는 검사) 할 수 없습니다. .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top