将 NSMutableArray 保存到 iPhone 文档目录
Posted
技术标签:
【中文标题】将 NSMutableArray 保存到 iPhone 文档目录【英文标题】:Saving NSMutableArray to the iPhone Documents Directory 【发布时间】:2012-04-22 15:32:19 【问题描述】:我正在尝试使用名为 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");
【问题讨论】:
查看归档/取消归档 - 你的狗类将不得不采用 NSCoding 协议。 【参考方案1】:您无法保存对象数组,因为对象不是 NSString、NSData、NSArray 或 NSDictionary。您可以使用 NSKeyArchiver and 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"];
一旦我们实现了协议,保存将如下所示: // 保存方法 // 我们初始化我们的对象并设置值
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
希望对你有帮助 很乐意提供帮助。*
【讨论】:
【参考方案2】:查看NSKeyedArchiver
& NSKeyedUnarchiver
具体而言,您希望+ archiveRootObject:toFile:
保存文件并再次提取文件+ unarchiveObjectWithFile:
。
您还需要在 Dog
类中实现 NSCoding 协议才能使这项工作正常进行。您只需为每个属性使用- encodeObject: forKey:
和– decodeObjectForKey:
之类的东西。 NSCoder 的文档将向您展示对哪种属性类型使用哪种方法(例如,使用BOOL
s,您使用- encodeBool: forKey:
)。
【讨论】:
【参考方案3】:行业答案: SDK 中有一个完整的主题,称为“Archiving and Serialization”。
如果您没有时间学习,但您的狗有: 教你的狗两个新技巧: 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]];
【讨论】:
以上是关于将 NSMutableArray 保存到 iPhone 文档目录的主要内容,如果未能解决你的问题,请参考以下文章
将 NSMutableArray 保存到 plist [关闭]
使用 NSKeyedArchiver 将 NSMutableArray 保存到 NSUserDefaults