【问题标题】:How do I archive an NSArray of NSDictionary (with NSCoding)?如何归档 NSDictionary 的 NSArray(使用 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。我该怎么做? (如果有问题,请随时指出分配方式中的任何错误)。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

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

    【讨论】:

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