如何归档 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
进行序列化,那么NSArray
和NSDictionary
上都有一个writeToFile:atomically:
方法。这会将您的对象序列化为属性列表 (*.plist
)。唯一需要注意的是,要序列化的“树”中的所有对象都必须是 NSString
、NSData
、NSArray
或 NSDictionary
(请参阅文档)。我不确定NSNumber
是如何适应的,但如果运气好的话,它也会被序列化和反序列化。将文件转回字典或数组的逆向方法称为initWithContentsOfFile:
。
至于您的代码,我会使用[NSMutableDictionary dictionary]
方便的方法来获取自动发布的字典。它比通常的 alloc
和 init
短,并且您为显式发布节省了一行。
【讨论】:
NSNumber
和 NSDate
在 plist 中都可以正常工作。也不需要wordDict = nil;
如果我将结果存储在数据库 (SQLite) 中而不是写入文件中,我可以使用类似的东西吗?
属性列表是一个字符串,你几乎可以将它存储在任何地方。我只是不确定这是否是最好的主意,你真正想做什么?
我有一个非常大的数据库,我正在对其进行实时搜索。无论我如何优化它,它都没有我想要的相当快 - 但可以接受。但是,如果我为某人进行的搜索(限制为 20)创建一个键,那么我可以存储它,随后的搜索会快得多。我不希望应用程序超过 20 兆,所以我不能提前这样做。 (您能否编辑您的答案并添加如何创建 plist)
啊哈。在这种情况下,您可能会问一个关于查询缓存或数据库优化的新问题?因为用结构化字符串数据存储另一列听起来并不理想。 ¶ 创建 plist 字符串很容易,只需使用上述方法创建一个temporary file,然后将文件内容读入一个字符串(为此有一个特殊的初始化程序)。以上是关于如何归档 NSDictionary 的 NSArray(使用 NSCoding)?的主要内容,如果未能解决你的问题,请参考以下文章