1

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

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");
4

3 に答える 3

2

オブジェクトはNSString、NSData、NSArray、またはNSDictionaryではないため、オブジェクトの配列を保存することはできません。NSKeyArchiverおよび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"];  
} 

プロトコルを実装すると、保存は次のようになり
ます。//Saveメソッド
//オブジェクトを初期化して値を設定します

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  

それがあなたを助けてくれることを願ってい
ます。*

于 2012-04-22T19:47:11.377 に答える
1

を見てください。具体的には、ファイルを保存して再度抽出する必要がありNSKeyedArchiverます。NSKeyedUnarchiver+ archiveRootObject:toFile:+ unarchiveObjectWithFile:

Dogこれを機能させるには、クラスにもNSCodingプロトコルを実装する必要があります。プロパティごとに、の- encodeObject: forKey:ようなものを使用する必要があります。– decodeObjectForKey:NSCoderのドキュメントには、どの種類のプロパティタイプにどのメソッドを使用するかが示されています(たとえば、BOOLを使用する場合- encodeBool: forKey:)。

于 2012-04-22T17:33:00.197 に答える
0

産業上の回答: 「アーカイブとシリアル化」と 呼ばれるSDKには、これに関するすべての主題があります。

学ぶ時間がないが、犬がしている場合: 犬に2つの新しいトリックを教えます。1。文字列やintなどの辞書として自分自身をレンダリングする方法。2.同じ種類の辞書から自分自身を初期化する方法。これは基本的に、産業の答えのゲットーバージョンです。

// 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]];
于 2012-04-22T17:15:49.947 に答える