2012-04-22 13 views
1

Dogと呼ばれるカスタムクラスのオブジェクトを使用して可変配列を作成し、後でファイルから読み込んで自分のアプリケーションに戻すためにiPhoneドキュメントディレクトリのファイルに保存しようとしています。 NSArrayのwriteToFile:atomically:メソッドを使用してこれを実行しようとしていますが、このメソッドの結果をテストすると、常にNOの値が返され、ファイルは作成されず、配列は格納されません。私はこれについていくつか質問があります。アレイを保存するファイルフォーマットは何ですか?配列にファイルをアトミックに書き込むことは何を意味しますか?配列が格納されたら、ファイルの内容を読み込むにはどうしたらいいですか?最も重要なのは、配列が指定されたパスのファイルに格納されないのはなぜですか?事前にありがとうございます、ここで私は私のアプリのviewDidLoadメソッド内使用していたコードです:NSMutableArrayをiPhoneドキュメントディレクトリに保存する

NSString *documentsDir = [NSSearchPathForDirectoriesInDomains 
          (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; 
dogFilePath = [documentsDir stringByAppendingPathComponent:@"arrayDogsFile.plist"]; 
NSFileManager *fileManager = [[NSFileManager alloc] init]; 

NSLog(@"%@",dogFilePath); 

Dog *dog1 = [[Dog alloc] init]; 
dog1.name = @"Dog1"; 
Dog *dog2 = [[Dog alloc] init]; 
dog2.name = @"Dog2"; 
Dog *dog3 = [[Dog alloc] init]; 
dog3.name = @"Dog3"; 

NSMutableArray *arrayDogs = [NSMutableArray array]; 
[arrayDogs addObject: dog1]; 
[arrayDogs addObject: dog2]; 
[arrayDogs addObject: dog3]; 

//Sorts the array in alphabetical order according to name – compareDogNames: is defined in the Dog class 
arrayDogs = (NSMutableArray *)[arrayDogs sortedArrayUsingSelector:@selector(compareDogNames:)]; 


if ([arrayDogs writeToFile:dogFilePath atomically:YES]) 
    NSLog(@"Data writing successful"); 
else 
    NSLog(@"Data writing unsuccessful"); 
+1

アーカイブ/アンアーカイビングに見て - あなたの犬のクラスは、NSCodingプロトコルを採用する必要があります。 –

答えて

2

オブジェクトはNSStringの、のNSData、NSArrayの、またはNSDictionary.Youは、むしろ例えばNSKeyArchiver and NSKeyUnArchiver
を使用することができませんので、あなたがオブジェクトのあなたの配列を保存することはできません。
#import "Foundation/Foundation.h"

@interface Dog : NSObject {**NSCoding**}//your class must conform to NSCoding Protocol 
@property (retain) NSString *Name; 
@end 

を実装ニーズいくつかの追加コード。 NSCodingプロトコルを実装する必要があります。つまり、 という2つの方法があります。(initWithCoder:とencodeWithCoder :)
#import "Dog.h"

@implementation Dog 
@synthesize Name; 
-(id)initWithCoder:(NSCoder*)decoder{  
    if ((self = [super init])) { 
     Name = [decoder decodeObjectForKey:@"Name"]; 
} 
    return self; 
} 



-(void)encodeWithCoder:(NSCoder*)encoder{ 
    [encoder encodeObject:Name forKey:@"Name"]; 
} 

我々はプロトコルを実装すると、省は次のようになります。
//保存方法
//私たちは、初期化私たちのオブジェクトと値を設定

Dog *dog1 = [[Dog alloc] init]; 
dog1.Name= @"Dog1"; 
Dog *dog2 = [[Dog alloc] init]; 
dog2.Name= @"Dog2"; 
Dog *dog3 = [[Dog alloc] init]; 
dog3.Name= @"Dog3";  
NSMutableArray *arrayDogs = [NSMutableArray array]; 
[arrayDogs addObject: dog1]; 
[arrayDogs addObject: dog2]; 
[arrayDogs addObject: dog3]; 

//名前に応じてアルファベット順に配列をソートする - compareDogNames:はDogクラスで定義されている

arrayDogs = (NSMutableArray *)[arrayDogs sortedArrayUsingSelector:@selector(compareDogNames:)]; 

//保管配列

[NSKeyedArchiver archiveRootObject:arrayDogs toFile:dogFilePath]; 

//ロード配列*

NSMutableArray* retreivedADogObjs = [NSKeyedUnarchiver unarchiveObjectWithFile:dogFilePath]; 
@end 

は、それはあなたに助けて幸せ
を助けることを願っています。*

+0

ありがとうございました。この方法論は完全に機能する – bnasty

0

産業の答え: 全体の主題は「Archiving and Serialization」と呼ばれるSDKには、このためにあります。

あなたが学習する時間を持っていませんが、あなたの犬がない場合:ように文字列とint型の辞書として自分自身をレンダリングする方法1.: はあなたの犬二つの新しいトリックを教えます。どのように同じ種類の辞書から自分自身を初期化する。これは基本的に産業上の答えのゲットー版です。

// Dog.m 
- (NSDictionary *)asDictionary { 

    NSMutableDictionary *answer = [NSMutableDictionary dictionary]; 
    [answer setValue:self.name forKey:@"name"]; 
    [answer setValue:self.numberOfBones forKey:@"numberOfBones"]; 
    return [NSDictionary dictionaryWithDictionary:answer]; 
} 

- (id)initWithDictionary:(NSDictionary *)dictionary { 

    self = [super init]; 
    if (self) { 
     self.name = [dictionary valueForKey:@"name"]; 
     self.numberOfBones = [dictionary valueForKey:@"numberOfBones"]; 
    } 
    return self; 
} 

書くとき:

[arrayDogs addObject: [dog1 asDictionary]]; 
1

ルック& NSKeyedUnarchiverNSKeyedArchiverで具体的にあなたが+ archiveRootObject:toFile:ファイルを保存したいと+ unarchiveObjectWithFile:は再びそれを抽出すること。

この作業を行うには、DogクラスにNSCodingプロトコルを実装する必要があります。各プロパティには- encodeObject: forKey:– decodeObjectForKey:のようなものを使用するだけです。 NSCoderのドキュメントでは、どの種類のプロパティタイプをどのメソッドに使うかを示します(例えば、BOOLの場合は- encodeBool: forKey:を使用します)。

関連する問題