2013-02-27 127 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