writeToFile 不适用于 NSDictionary [重复]
Posted
技术标签:
【中文标题】writeToFile 不适用于 NSDictionary [重复]【英文标题】:writeToFile not working with NSDictionary [duplicate] 【发布时间】:2013-09-06 07:42:21 【问题描述】:我查看了有关此问题的其他类似问题,但没有真正奏效。
我设法在我的 Plist 上只写了一对(对象/键)字典(例如:setObject:itemProperties[0] forKey[0])。但我想添加所有的对象和键。到目前为止我没有管理(返回错误)。有什么帮助吗?
// Path to Documents Folder
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"items.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path])
path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat: @"items.plist"] ];
NSMutableDictionary *items;
if ([fileManager fileExistsAtPath: path])
items = [[NSMutableDictionary alloc] initWithContentsOfFile: path];
else
// If the file doesn’t exist, create an empty dictionary
items = [[NSMutableDictionary alloc] initWithCapacity:5];
// array of the item properties
NSArray *itemProperties = @[myItem.itemTitle, myItem.itemImage, myItem.itemPositionX, myItem.itemPositionY, myItem.itemHeight, myItem.itemWidth];
// Set the key values for each field
NSArray *keys = @[@"Title", @"Image", @"PositionX", @"PositionY", @"Height", @"Width"];
[items setObject:itemProperties forKey:keys];
//Save dictionnary to Plist
[items writeToFile: path atomically:YES];
if (![items writeToFile:path atomically:YES])
NSLog(@"Error with creating Plist");
【问题讨论】:
【参考方案1】:您有时无法控制要编写的内容。例如,当您要编写从服务器获取的 JSON 对象时,您无法避免 null
值。
NSData
与这些“无效”值兼容,因此在这些情况下,将NSArray
或NSDictionary
转换为NSData
是一种理想的方式。
写:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:jsonObject];
[data writeToFile:path atomically:YES];
阅读:
NSData *data = [NSData dataWithContentsOfFile:path];
NSDictionary *jsonObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];
【讨论】:
您不应从Why NSMutableDictionary don't want write to file? 复制/粘贴您的答案,而应将此问题标记为您最初回答的问题的副本(如果它确实是一个)。如果它不是重复的,那么你的答案是无效的。 抱歉,我不知道我可以将问题标记为重复问题。我以后会做的。 帮帮我,这很好用! 这是我们的问题,这就是解决方案!【参考方案2】:您是否正确使用了有效的键和值?
此方法递归地验证所有包含的对象是 属性列表对象(NSData、NSDate、NSNumber 的实例, NSString、NSArray 或 NSDictionary)在写出文件之前,以及 如果所有对象都不是属性列表对象,则返回 NO,因为 结果文件不是有效的属性列表。
参考:writeToFile:atomically:
【讨论】:
感谢您的回答。我刚刚检查了我的数组,有些对象不在该列表中。以上是关于writeToFile 不适用于 NSDictionary [重复]的主要内容,如果未能解决你的问题,请参考以下文章
writeToFile:atomically: 会覆盖数据吗?