如何从 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 中反序列化对象。由于要更改数据,因此需要反序列化为可变对象。当您使用 NSPropertyListMutableContainers
或 NSPropertyListMutableContainersAndLeaves
选项时,NSPropertyListSerialization
的 propertyListWithData: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];
这将为您提供NSMutableArray
s、NSMutableDictionary
s、NSString
s 或NSMutableString
s 的嵌套集合(取决于您是否指定了NSPropertyListMutableContainers
或NSPropertyListMutableContainersAndLeaves
)等。反序列化 plist 后,使用集合提供的任何方法来删除(例如 NSMutableArray
的 removeObjectAtIndex:
、NSMutableDictionary
的 removeObjectForKey:
)或设置(例如 replaceObjectAtIndex:withObject:
、setObject:forKey:
)项目。
欲了解更多信息,请阅读Property List Programming Guide。
【讨论】:
+1 用于使用可变容器选项。我从不记得存在:)以上是关于如何从 plist 更新和删除字符串项和整个字典项的主要内容,如果未能解决你的问题,请参考以下文章
macOS: 使用新版plutil命令操作Plist文件更方便