27

オブジェクトの辞書があります。それらはすべてシリアライズ可能であるべき POCO オブジェクトです。これらをディスクに書き込むには、どのような手法を検討する必要がありますか。状態を保存するためにいくつかのリストを作成する最も簡単なオプションを探しています。

私には3つの選択肢があると思います。

  1. plist ファイル。ただし、これは事前定義されたオブジェクト (文字列、数字など) のみを保存することに制限されているようです (名前と年齢を持つ人物など)。

  2. コアデータ。(3.0 の新機能) これはうまく機能します。ただし、これを機能させるには、データ モデルを変更する必要があります。これは大規模な再作業になるため、努力する価値があるかどうかはわかりません。

  3. SQLライト。読み書きする単純な SQL データベースを実装します。私はこれについて最小限の調査を行いましたが、コア データ ORM 関数の一部を「書き直す」必要はありません。

4

3 に答える 3

32

NSCodingカスタム オブジェクトをシリアル化するには、プロトコルに準拠する必要があります。あなたのオブジェクトが NSObject を拡張する場合、あなたがする必要があるのは(私が信じている)これらを実装することだけです(人のオブジェクトの例):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArrayNSDictionaryシリアル化のメソッドを既に実装しています。それらは、保持するすべてのオブジェクトをシリアル化します (オブジェクトが NSCoder インターフェイスを実装している場合 - それらが NSObject を拡張している場合)。NSObjectはデフォルトencodeWithCoderinitWithCoderは何もしないので、クラスに独自のコードを実装しない限り、何もシリアル化されません。

オブジェクトの NSArray または NSDictionary がある場合は、次を使用してそれらを同期できます。

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;
于 2009-05-18T03:37:55.377 に答える
14

これは、Mac OS X で行うのと同じ方法で行います。POCO はNSCodingプロトコルに準拠している必要があります。概念的なリファレンスについてはこちらを、NSCoding リファレンスについてはこちらを参照してください。

データがそれほど膨大ではなく、オブジェクト間に途方もなく複雑な関係がない場合は、すべてを plist として書き出すのがおそらく最良の選択肢です。実行が非常に高速で、コードに簡単に実装できます。あなたが言ったように、CoreData はおそらくコードを適応させるための多くの余分な作業になるでしょう.sqlite はリレーショナル データベースに格納するのに最適なデータを格納するのにしか適していません. sqlite も遅く、バイナリ plist で作業するよりも多くのリソースを使用することに注意してください。

于 2009-05-18T02:44:40.433 に答える
0

NSCoderシリアル化のための標準的な Cocoa イディオムです。

于 2009-05-18T02:47:12.750 に答える