如何归档 NSDictionary 的 NSArray(使用 NSCoding)?

Posted

技术标签:

【中文标题】如何归档 NSDictionary 的 NSArray(使用 NSCoding)?【英文标题】:How do I archive an NSArray of NSDictionary (with NSCoding)? 【发布时间】:2011-03-27 07:17:01 【问题描述】:

假设我将数据保存在这样的数组中

wordList = [[NSMutableArray alloc] init];
while ([rs next])     //Some database return loop

    wordDict = [[NSMutableDictionary alloc] init];

    [wordDict setObject:[NSNumber numberWithInt:[rs intForColumn:@"id"]] forKey:@"id"];
    [wordDict setObject:[rs stringForColumn:@"word"] forKey:@"word"];

    [wordList addObject: wordDict];

    [wordDict release];
    wordDict = nil;

但我想将此结果(即 wordList)存储在 SQLite 中以供以后使用 - 我想使用 NSCoding。我该怎么做? (如果有问题,请随时指出分配方式中的任何错误)。

【问题讨论】:

【参考方案1】:

如果您不坚持使用NSCoding 进行序列化,那么NSArrayNSDictionary 上都有一个writeToFile:atomically: 方法。这会将您的对象序列化为属性列表 (*.plist)。唯一需要注意的是,要序列化的“树”中的所有对象都必须是 NSStringNSDataNSArrayNSDictionary(请参阅文档)。我不确定NSNumber 是如何适应的,但如果运气好的话,它也会被序列化和反序列化。将文件转回字典或数组的逆向方法称为initWithContentsOfFile:

至于您的代码,我会使用[NSMutableDictionary dictionary] 方便的方法来获取自动发布的字典。它比通常的 allocinit 短,并且您为显式发布节省了一行。

【讨论】:

NSNumberNSDate 在 plist 中都可以正常工作。也不需要wordDict = nil; 如果我将结果存储在数据库 (SQLite) 中而不是写入文件中,我可以使用类似的东西吗? 属性列表是一个字符串,你几乎可以将它存储在任何地方。我只是不确定这是否是最好的主意,你真正想做什么? 我有一个非常大的数据库,我正在对其进行实时搜索。无论我如何优化它,它都没有我想要的相当快 - 但可以接受。但是,如果我为某人进行的搜索(限制为 20)创建一个键,那么我可以存储它,随后的搜索会快得多。我不希望应用程序超过 20 兆,所以我不能提前这样做。 (您能否编辑您的答案并添加如何创建 plist) 啊哈。在这种情况下,您可能会问一个关于查询缓存或数据库优化的新问题?因为用结构化字符串数据存储另一列听起来并不理想。 ¶ 创建 plist 字符串很容易,只需使用上述方法创建一个temporary file,然后将文件内容读入一个字符串(为此有一个特殊的初始化程序)。

以上是关于如何归档 NSDictionary 的 NSArray(使用 NSCoding)?的主要内容,如果未能解决你的问题,请参考以下文章

NSKeyedArchiver

归档反归档 - 本地沙盒存储复杂对象

IOS-Archiver文件归档

IOS 存储方式(PList、NSUserDefaults、归档、CoreData、数据库、文件)

iPhone 上的存档位置

如何修复错误无法将 [NSDictionary] 快速转换为 NSDictionary?