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 协议,这意味着 两个额外的方法。(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:and的东西。– decodeObjectForKey:NSCoder 的文档将向您展示针对哪种属性类型使用哪种方法(例如使用BOOLs - encodeBool: forKey:)。

于 2012-04-22T17:33:00.197 回答
0

行业答案: SDK 中有一个完整的主题,称为“存档和序列化”。

如果您没有时间学习,但您的狗有: 教您的狗两个新技巧: 1. 如何将自己呈现为字符串和整数的字典等等。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 回答