2013-02-27 36 views
2

我目前正在使用这个博客,它使用NSKeyedArchiver使用的自定义类。一切似乎都是正确的,但我想知道如何获得“学生”的不同实例。在NSKeyedArchiver中查找不同的实例

http://keeptheseinmind.blogspot.com/2011/10/nskeyedarchiver-tutorial.html

在本教程中,自定义类“学生”的新实例每次创建时的应用程序被终止。我假定NSKeyedArchiver中有许多这样的“学生”实例,但我只能访问其中的一个。

从盘面

- (void)loadDataFromDisk { 
    NSString *path = @"~/Documents/data"; 
    path = [path stringByExpandingTildeInPath]; 

    NSMutableDictionary *rootObject; 
    rootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

    if ([rootObject valueForKey:@"student"]) { 
     student = [rootObject valueForKey:@"student"]; 
    } 
} 

编辑保存到磁盘

- (void)saveDataToDisk { 
    NSString *path = @"~/Documents/data"; 
    path = [path stringByExpandingTildeInPath]; 

    NSMutableDictionary *rootObject; 
    rootObject = [NSMutableDictionary dictionary]; 

    [rootObject setValue:student forKey:@"student"]; 

    [NSKeyedArchiver archiveRootObject:rootObject toFile:path]; 
} 

加载:

我错了,每次都互相覆盖的情况下,每次应用程序正在终止。有趣的...

但是,我的目标仍然是在一个或多个NSKeyedArchiver中创建“学生”的许多实例。任何想法将不胜感激。

回答

2

您可以将NSKeyedArchiver视为将对象(序列化)保存到磁盘的一种方式。在你的情况,对象是一个NSDictionary,刚好有一个键,student(我使用JSON十岁上下的记号来呈现数据结构;有希望的意图是明确的):

"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连接起来构建。

+0

我想用学生数组的方法。但是,我想建立加班学生人数;当我们想要将其归档时,它不一定会准备好。我想先看到档案数据文件内的学生,然后添加学生。我试图通过解压缩来解决这个问题(如果文件存在),然后将其存档,但现在似乎没有任何东西被存储。 – freedom 2013-02-27 18:12:47

+0

但是,根据我的需要,刚刚尝试了新的密钥方法!穆乔格拉西亚斯! :) 好想法! – freedom 2013-02-27 18:34:26

+0

和...得到这个之后,我回到了NSMutableArray,并得到它的工作:)! 首先,我将NSMutableArray设置为rootObject,并使用addObject方法。在这种情况下应该没有使用密钥。 – freedom 2013-02-27 18:54:29