10

NSObject から単純に継承するカスタム オブジェクトがあります。2 つのフロートとNSDate.

私のアプリには、これらのオブジェクトの数が動き回る配列があり、実行間でそれを永続化する必要があります。どうすればこれを達成できますか?

私は SQLite db を使用することを考えましたが、私がこれまでに行う唯一のクエリはselect *.

理想的な世界では、xml plist ファイルを使用したいと考えています。ただし、カスタム オブジェクトでこれを実行できるかどうかはわかりません。NSArrayプロパティ リスト オブジェクトのセットがあり、その下にあることは知っていますが、writeToFile:atomically:プロパティ リスト オブジェクトでのみ機能します。

任意の考えをいただければ幸いです、ありがとう!

4

2 に答える 2

21

NSCodingあなたが望むことを正確に行います。Apple のドキュメントを読むことをお勧めしますが、使い方はかなり簡単だと思いました。クラス (およびすべての子クラス) は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];
}

もう 1 つはアーカイブを解除するか、新しいオブジェクトを作成します。

+(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;
}

最上位オブジェクトは であるNSArrayため、最後の 2 つのメソッドをケースに合わせて変更する必要がありますが、ボイラープレート コードのほとんどは同じです。

于 2009-03-15T19:58:42.913 に答える
0

オブジェクトのサブセットを取得する場合は、SQLite が最適です。

そうでない場合は、plist 形式と NSCoding のどちらかを選択します。plist では、カスタム オブジェクトを plist に適したものに変換してから、plist をオブジェクトに戻すことができる必要がありますが、NSCoding は頭を包み込むのが少し難しく、手動で簡単に編集 (または調査) することはできません。 .

于 2009-03-15T18:41:25.923 に答える