2012-11-10 10 views
5

私はCookbookアプリケーションを作成しています。作成したクラス(レシピクラス)のデータを保存する方法については何も見つかりませんでした。プロパティリストオブジェクトではないObjective-Cオブジェクトを保存するにはどうすればよいですか、プロパティリストよりも良い方法がありますか?

-(void) writeToFile:(NSString *)file atomically:(BOOL)atomic{ 

} 

しかし、私は持っている:私が見てきた唯一の方法は、おそらく、個別に私のレシピクラスに対してこの方法を行うことにより、各オブジェクトのクラスのすべての要素を保存せずに、全体として、このクラスの内容を保存することですこのメソッドを使用してこのオブジェクトをファイルに保存するには、これを実装するにはどうすればいいか分かりません。プロパティの一部は次のとおりです。

NSString* name; 
UIImage* recipePicture; 
NSDate* dateAdded; 
NSMutableArray* ingredients; //The contents are all NSStrings. 

レシピクラスのオブジェクトを保存する方法を知っている人はいますか? それは私がそれを理解することができない夢中になってきた。どんな助けでも大歓迎です。私は既に、 "RecipeData.plist"というタイトルの.plistを持っています。 plistにすべてのプロパティを書き込んで、実行時にこれらのプロパティを使ってレシピの新しいオブジェクトを初期化するだけでよいですか?

答えて

5

採用:

@interface Recipe : NSObject<NSCoding> 

実装します

- (void)encodeWithCoder:(NSCoder *)coder 
{ 
    [coder encodeObject:name_ forKey:@"name"]; 
    [coder encodeObject:recipePicture_ forKey:@"recipePicture"]; 
    [coder encodeObject:dateAdded_ forKey:@"dateAdded"]; 
    [coder encodeObject:ingredients_ forKey:@"ingredients"]; 

を}

// Decode an object from an archive 
- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super init]; 
    if (self!=NULL) 
    { 
     name_ = [coder decodeObjectForKey:@"name"]; 
     recipePicture_ = [coder decodeObjectForKey:@"recipePicture"]; 
     dateAdded_ = [coder decodeObjectForKey:@"dateAdded"]; 
     ingredients_ = [coder decodeObjectForKey:@"ingredients"]; 
    } 
    return self; 
} 

を今すぐにあなたの節約:

- (void) save:(NSString*)path recipe:(Recipe*)recipe 
{ 
    NSMutableData* data=[[NSMutableData alloc] init]; 
    if (data) 
    { 
     NSKeyedArchiver* archiver=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
     if (archiver) 
     { 
      [archiver encodeInt:1 forKey:@"Version"]; 
      [archiver encodeObject:recipe forKey:@"Recipe"]; 
      [archiver finishEncoding]; 

      [data writeToFile:path atomically:YES]; 

     } 
    } 
} 

と負荷に:

- (Recipe*) load:(NSString*)path 
{ 
    Recipe* ret=NULL; 
    NSData* data=[NSData dataWithContentsOfFile:path]; 
    if (data) 
    { 
     NSKeyedUnarchiver* unarchiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
     if (unarchiver) 
     { 
      int version=[unarchiver decodeIntForKey:@"Version"]; 
      if (version==1) 
      { 
       ret=(Recipe*)[unarchiver decodeObjectForKey:@"Recipe"]; 
      } 
      [unarchiver finishDecoding]; 
     } 
    } 
    return ret; 
} 
+0

これを回答の残りの3分の2 - プロパティリストに格納するNSDataオブジェクトにエンコードする方法と、プロパティリストからデータをデコードする方法についてこれを更新する必要があります。 – rmaddy

+0

以下のコメントで私が言ったように、これを行う方法を私に見せてくれることに感謝します。本当に大きな助けになっています。 – crarho

+0

'self = [super init];'の代わりに 'self = [super initWithCoder:coder];を呼び出すべきです。それ以外の場合、スーパークラスはエンコードされたデータを持ちません。 –

2

(エンコード/デコードのほかに)1つのオプションは、辞書にあなたのクラスの各属性を格納することです。次に、その辞書にファイルを書き込みます。トリックは、あなたが辞書に入れたすべてのオブジェクトがplistで許可されることを保証することです。表示する4つのプロパティのうち、UIImageを除くすべてのプロパティをそのまま保存できます。

-(BOOL)writeToFile:(NSString *)file atomically:(BOOL)atomic{ 
    NSMutableDictionary *data = [NSMutableDictionary dictionary]; 

    [data setObject:name forKey:@"name"]; 
    [data setObject:dateAdded [email protected]"dataAdded"]; 

    NSDate *imageData = UIImagePNGRepresentation(recipePicture); 
    [data setObject:imageData forKey:@"recipePicture"]; 

    // add the rest 

    return [data writeToFile:file atomically:YES]; 
} 

これを更新してBOOLを返すようにしました。

  1. ファイル
  2. 不適切だったあなたが避けるためにコードを追加する必要がありdictonary

に非plistの優しいオブジェクトを保存しようとしました:それが失敗した場合、それは2つのうちの1つが意味します何かがある場合はnilオブジェクトを追加しようとしています。重要なことは、すべてのキーが文字列で、plist-friendlyオブジェクト(NSString、NSNumber、NSDate、NSValue、NSData、NSArray、およびNSDictionary)のみが格納されていることを確認することです。

+0

ありがとうございました。大変感謝しています。この問題は今私を悩ませています。 – crarho

関連する問題