使用NSKeyedArchiver存储自定义数据模型

时间:2012-06-07 09:32:51

标签: objective-c ios

我正在使用rss阅读器。它只是一个tableview,每个单元格显示一个自定义数据模型RSSEntry。我有一个NSMutableArray allEntries,它包含我从服务器获得的所有RSSEntry。这就是RSSEntry的样子:

    @interface RSSEntry : NSObject <NSCoding> {
        NSString *_blogTitle;
        NSString *_articleTitle;
        NSString *_articleUrl;
        NSDate *_articleDate;
    }

我想从本地存档中恢复数据,因此当我退出并再次打开此应用时,会在上次刷新时使用数据填充tableview。

我已经阅读了“开始iOS5编程”中的示例,但它只存储和恢复一个数据模型。所以我不知道如何存储这个充满自定义数据模型的可变数组并恢复它。

我使用以下代码来存储和恢复数据:

// STORE
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:entry forKey:kDataKey];
[archiver finishEncoding];

// RESTORE
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath:kFilename]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
RSSEntry *entries = [unarchiver decodeObjectForKey:kDataKey];
[unarchiver finishDecoding];

我只能以这种方式存储和恢复一个数据模型。

谁能帮助我。我是iOS编程的新手,也许它有点沉闷。来自。

3 个答案:

答案 0 :(得分:19)

将您要存储的所有条目放入NSArray并使用以下代码:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries];

entries是您的条目数组。很好,很简单,只需一行代码。

要取消归档,只需使用

即可
NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data];

NSKeyedArchiver能够归档任何实现NSCoding协议的Objective-C对象的数据结构,甚至是非常复杂的数据结构,包括嵌套的{{1} } s,NSArray和自定义对象到文件。 NSDictionary执行相反的操作,获取NSKeyedUnarchiver生成的任何数据并重新建立已归档的原始对象图。从技术上讲,它们可能只是一个单独的类,但Apple决定将它们按功能分开,因为这在语法上更正确或者其他东西:)

我假设您能够将生成的NSKeyedArchiver对象写入文件,然后再将其读回。

答案 1 :(得分:6)

您可以将NSDictionary存储为以下

NSDictionary *Your_NSDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"Obj1", @"Key1",
                               @"Obj2", @"Key2", nil];
//store dictionary
NSMutableData *yourData = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:yourData];
[archiver encodeObject:Your_NSDictionary forKey: @"key"];
archiver finishEncoding];
[yourData writeToFile:@"FilePath" atomically:YES];
[yourData release];
[archiver release];


//Load dictionary

NSData *yourData = [[NSMutableData alloc]initWithContentsOfFile:@"FilePath"];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:yourData];
Your_NSDictionary = [unarchiver decodeObjectForKey: @"key"];
[unarchiver finishDecoding];
[unarchiver release];
[yourData release];

答案 2 :(得分:2)

对于iOS 12:

archivedDataWithRootObject

NSData *myDicData = [NSKeyedArchiver archivedDataWithRootObject:AllDataDic 
                                     requiringSecureCoding:YES error:nil];
[[NSUserDefaults standardUserDefaults] setObject:myDicData forKey:@"Yourkey"];

unarchivedObjectOfClass

NSData *tempData = [[NSUserDefaults standardUserDefaults] valueForKey:@"Yourkey"];
NSDictionary *myDicProfile = [NSKeyedUnarchiver unarchivedObjectOfClass:[NSDictionary class] 
                                                fromData:tempData error:nil];