我目前正在使用此博客,它使用与NSKeyedArchiver一起使用的自定义类。一切似乎都是正确的,但我想知道如何获得“学生”的不同实例。
http://keeptheseinmind.blogspot.com/2011/10/nskeyedarchiver-tutorial.html
在本教程中,每次终止应用程序时都会创建自定义类“students”的新实例。我假设NSKeyedArchiver中有很多这样的“学生”实例,但我只能访问其中一个。
保存到磁盘
- (void)saveDataToDisk {
NSString *path = @"~/Documents/data";
path = [path stringByExpandingTildeInPath];
NSMutableDictionary *rootObject;
rootObject = [NSMutableDictionary dictionary];
[rootObject setValue:student forKey:@"student"];
[NSKeyedArchiver archiveRootObject:rootObject toFile:path];
}
从磁盘加载
- (void)loadDataFromDisk {
NSString *path = @"~/Documents/data";
path = [path stringByExpandingTildeInPath];
NSMutableDictionary *rootObject;
rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
if ([rootObject valueForKey:@"student"]) {
student = [rootObject valueForKey:@"student"];
}
}
修改
我错了,每次应用程序终止时,每次实例都会相互覆盖。有趣...
但是,我的目标仍然是在一个或多个NSKeyedArchiver中创建许多“学生”实例。任何想法都将不胜感激。
答案 0 :(得分:2)
您可以将NSKeyedArchiver
视为将对象(序列化)保存到磁盘的一种方法。在您的情况下,该对象是NSDictionary
,它只有一个密钥student
(我使用JSON-ish表示法来显示数据结构;希望意图很清楚):
"student" : { "studentId" : 25,
"studentName" : "John Smith"
}
正如您所注意到的,每次拨打saveDataToDisk
时,都会覆盖该单个“学生”密钥。为了节省一个以上的学生,有几种方法可以解决这个问题:您的选择取决于您想要如何阅读数据。
一种选择是存储数组,而不是NSDictionary
:
"student" : [ { "studentId: 25, "studentName" : "John Smith" },
{ "studentId: 26, "studentName" : "Jane Doe" } ]
如果采用这种方法,您需要确保saveDataToDisk
可以访问NSArray
个学生,并将该数组传递给rootObject setValue:
:
[rootObject setValue:students forKey:@"students"];
或者,你可以想象只想在词典中添加更多的键,每个键代表一个学生:
"student25" : { "studentId: 25, "studentName" : "John Smith" },
"student26" : { "studentId: 26, "studentName" : "Jane Doe" }
在这种情况下,您需要再次确保您的保存功能可以访问学生数组,但这次您将遍历该数组,并使用您自己构建的键将每个数组添加到rootDictionary通过(例如)将“student”与studentId连接起来。