如何从 plist 更新和删除字符串项和整个字典项

Posted

技术标签:

【中文标题】如何从 plist 更新和删除字符串项和整个字典项【英文标题】:How to UPDATE and DELETE string items and entire dictionary items from a plist 【发布时间】:2010-12-11 08:03:18 【问题描述】:
Root ---- Array
  Item 0- Dictionary
    fullName ---- String
    address ---- String
  Item 1 ---- Dictionary
    fullName ---- String
    address ---- String

我有以下 plist 结构。

Q1 如何更新/更改代码中的 fullName 已保存在 plist 文件中?

Q2 在上面的示例中,我如何只删除一个字典项目第 0 项?

我正在使用带有详细示例的导航控制器 TableView。

谢谢

【问题讨论】:

感谢您修复我的格式。我正在阅读“代码和预格式化文本”。 【参考方案1】:

您并没有真正更新或删除 plist 文件中的某些内容。比这更复杂一点:

    将 plist 文件读入内存 更改内存版本 将新版本写回磁盘

在 plist 中阅读非常简单。在你的情况下,由于根元素是一个数组,你会这样做:

NSMutableArray * plistContents = [NSMutableArray arrayWithContentsOfFile:plistFilePath];

这里我们创建了一个可变数组,因为我们知道我们将要更改其中的内容。如果我们只是想阅读信息,我们应该使用NSArray 而不是NSMutableArray

更改内存版本就像操作标准容器一样简单:

//delete the first dictionary:
[plistContents removeObjectAtIndex:0];

//Change a dictionary's full name:
NSMutableDictionary * firstDictionary = [[plistContents objectsAtIndex:0] mutableCopy];
[firstDictionary setObject:@"Mike" forKey:@"fullName"];
[plistContents replaceObjectAtIndex:0 withObject:firstDictionary];
[firstDictionary release];

这里我们必须制作字典的可变(可变)副本,因为在 plist 中读取只会创建不可变的NSDictionary。所以我们复制字典,改变我们想要改变的值,然后用我们修改后的新字典替换原来的字典。

将 plist 写入磁盘也很简单:

//be sure you have write-permissions first!
[plistContents writeToFile:plistFilePath atomically:YES];

【讨论】:

谢谢戴夫。我明天会在美国东部标准时间凌晨 4 点试试这个,我相信孩子们会在 6 点叫醒我。您的信息非常丰富且经过深思熟虑。 我把 [plistContents writeToFile:plistFilePath atomically:YES];在我的 ViewDidDisappear 中,效果很好。谢谢。现在我只需要让更新工作。更新发生在详细信息视图中,但是根据您给我的信息,我想我可以弄清楚。【参考方案2】:

您不直接对存储在 plist 中的数据进行操作,而是将对象序列化为 plist 或从 plist 中反序列化对象。由于要更改数据,因此需要反序列化为可变对象。当您使用 NSPropertyListMutableContainersNSPropertyListMutableContainersAndLeaves 选项时,NSPropertyListSerializationpropertyListWithData:options:format:error: 将反序列化创建可变集合的 plist。

NSError *err=nil;
NSData *raw = [[NSData alloc] initWithContentsOfFile:path];
id stuff = [NSPropertyListSerialization
                   propertyListWithData:raw
                                options:NSPropertyListMutableContainers 
                                 format:NULL
                                  error:&err;
      ];
if (err) 
    // couldn't parse the plist; handle the error.
    ...
    [err release];

[raw release];

这将为您提供NSMutableArrays、NSMutableDictionarys、NSStrings 或NSMutableStrings 的嵌套集合(取决于您是否指定了NSPropertyListMutableContainersNSPropertyListMutableContainersAndLeaves)等。反序列化 plist 后,使用集合提供的任何方法来删除(例如 NSMutableArrayremoveObjectAtIndex:NSMutableDictionaryremoveObjectForKey:)或设置(例如 replaceObjectAtIndex:withObject:setObject:forKey:)项目。

欲了解更多信息,请阅读Property List Programming Guide。

【讨论】:

+1 用于使用可变容器选项。我从不记得存在:)

以上是关于如何从 plist 更新和删除字符串项和整个字典项的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何编写字典对象的 plist 数组

如何以编程方式编辑 plist?

macOS: 使用新版plutil命令操作Plist文件更方便

更新 plist 字典中的布尔值

我如何在字典中附加一个数组(名称),并在 plist 中的同一数组下附加一个字典项?

使用可变数组从 Plist 加载表视图中的部分时遇到问题