无法在 iOS 中将数据写入 .plist
Posted
技术标签:
【中文标题】无法在 iOS 中将数据写入 .plist【英文标题】:can't write data to .plist in iOS 【发布时间】:2015-09-27 10:45:26 【问题描述】:我正在尝试使用下一个方法将数据写入 .plist 文件:
-(IBAction)saveCity:(id)sender
NSString * path = [[NSBundle mainBundle] pathForResource:@"propTest" ofType:@"plist"];
NSMutableArray * array = [NSMutableArray arrayWithContentsOfFile:path];
[ array addObject:@"addedTest"];
if ([array writeToFile:path atomically:NO])
NSLog(@"written");
我已经提前手动创建了 propTest.plist 和下一个内容:
调用 saveCity: 几次后,我可以看到从 propTest.plist 读取的数组包含我的字符串:
但实际上它只包含我手动添加的内容:
能否请您帮我找出新字符串未永久添加到 .plist 的原因?
【问题讨论】:
您不能写入包 - 这是一个只读包。应用启动后,您需要在文档目录中创建 plist 文件 【参考方案1】:简单的答案是 - 不,你不能这样做。 ios 应用程序在沙盒环境中运行,您无法在运行时修改应用程序包,因此您无法在 [NSBundle mainBundle]
中写入任何内容。
您应该改用应用程序的文档目录。这就是你可以做到这一点的方法。在这里,为了您的知识,我正在从主包中复制数据,添加新的详细信息并写回文档目录。
// Get you plist from main bundle
NSString *path = [[NSBundle mainBundle] pathForResource:@"propTest" ofType:@"plist"];
NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:path];
// Add your object
[array addObject:@"addedTest"];
// Get Documents directory path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistLocation = [documentsDirectory stringByAppendingPathComponent:@"propTest.plist"];
// Write back to Documents directory
[array writeToFile:plistLocation atomically:YES];
【讨论】:
感谢您的回答! 虽然这是正确的方法,但您应该使用 URL 而不是基于字符串的文件路径。 @Abizern,为什么 URL 更好?这是一种常见的做法,还是使用 URL 背后有真正的好处? @YuraVasylenko 在此处developer.apple.com/library/ios/documentation/FileManagement/… 的文档中的“使用现代文件系统接口”标题下有一句话 - 当决定调用哪些例程时,选择那些允许您使用 NSURL 对象指定路径的对象,而不是那些使用字符串指定路径的对象。以上是关于无法在 iOS 中将数据写入 .plist的主要内容,如果未能解决你的问题,请参考以下文章