2

我目前正在使用这个博客,它使用与 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 中创建许多“学生”实例。任何想法将不胜感激。

4

1 回答 1

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 中,并使用您构造的自己的键(例如示例)将“学生”与学生 ID 连接起来。

于 2013-02-27T08:45:20.087 回答