需要使用 Objective C 将新的键和值添加到 Plist 中? [复制]

Posted

技术标签:

【中文标题】需要使用 Objective C 将新的键和值添加到 Plist 中? [复制]【英文标题】:Need To Add New Keys and Values Into Plist Using Objective C? [duplicate] 【发布时间】:2015-12-29 04:51:47 【问题描述】:

我已将 JSON 数据存储创建到 Plist 中。现在的问题是在 JSON 数据存储之后,我需要在每个 dictionary 项的数组中添加两组键,如下图 Image_2。键名 isParent - Boolean YESisChild - Boolean YESlevels 如下图 Image_2 所述。

现在我有下面的 plsit 数据结构,它可以通过下面的代码完美地工作。

我需要为 objectsubjectcount 外部和 objectsubjectcount 内部红色标记的数据添加两个键。

NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers error:&error];
 NSDictionary *response = JSON[@"response"];
 NSArray *keys = [response allKeys];

 NSMutableArray *objects = [NSMutableArray new];
 for (NSString *key in keys) 
     NSMutableDictionary *object = response[key];
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subject = %@",object[@"subject"]];
     NSArray *objectsWithSameSubject = [objects filteredArrayUsingPredicate:predicate];
     NSInteger subjects = [object[@"subject"] integerValue];
     if (subjects > 0) 

         NSMutableArray *Objects_Subjectcount = [NSMutableArray new];
         [object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"];
         for (NSInteger i = 0; i < subjects; i++) 
             [Objects_Subjectcount addObject:object];// object or anything you need

         
     
     [objects addObject:object];
 

 NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsPath = paths.firstObject;
 NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"File.plist"];
 NSError *writeError = nil;
 NSDictionary *finalDict = @@"Objects": objects;
 NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListImmutable error:&writeError];
 if(plistData)
     [plistData writeToFile:plistPath atomically:YES];
 
 else 
     NSLog(@"Error in saveData: %@", error);
  

NOTE :所有的数据都是JSON存储的,但是存储后需要手动添加附加值!这就是我正在尝试的

【问题讨论】:

谢谢@Itteh Kitteh!你知道如何制作上述过程吗? 内部嬉戏做[Objects_Subjectcount addObject:@@"level":@(0), @"isChild":@(YES)];而在外循环 [object setObject:@(yes) forKey:@"isParent"]; 在提问之前先尝试一下,你只是从之前的答案中复制了代码并寻求帮助...... 请通过以下链接***.com/help/how-to-ask***.com/help/dont-ask 【参考方案1】:
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListMutable error:&writeError];

像这样从 plist 中检索数据。

NSMutableDictionary *plistDic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];

现在假设你想更新字典的第一个数组

NSMutableArray *array = [[NSMutableArray alloc]init:[plistDic objectAtIndex:0]]

如果要更改所有数组数据,可以执行 for 循环...对,我只是使用第一个对象数据..

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init:[array objectAtIncex:0]];
[dict addObject:"yourdata" forKey:"yourkey"];
[array replaceObject:dict atIndex:0];
[plistDic replaceObjectAtIndex:0 withObject:array];

最后

[plistDic writeToFile:plistPath atomically:YES];

【讨论】:

能否请您更新我上面的代码。我需要在 Items 下添加两个键,另一个布尔键需要为所有需要添加的 Item 添加 subjectcount Items。检查上面发布的图片! 你能更新答案吗!【参考方案2】:

来自 response[key] 的对象是不可变的,所以不能修改如下:

[object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"];

如下使其可变,可以通过任何方法添加/删除/设置进行修改。

NSMutableDictionary *object = [response[key] mutableCopy];

希望使用下面的修改块,您会看到所需的更改。

NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers error:&error];
NSDictionary *response = JSON[@"response"];
NSArray *keys = [response allKeys];

NSMutableArray *objects = [NSMutableArray new];
for (NSString *key in keys) 
    NSMutableDictionary *object = [response[key] mutableCopy];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subject = %@",object[@"subject"]];
    NSArray *objectsWithSameSubject = [objects filteredArrayUsingPredicate:predicate];
    NSInteger subjects = [object[@"subject"] integerValue];
    if (subjects > 0) 

        [object setObject:@"" forKey:@"level"];
        [object setObject:@(YES) forKey:@"isParent"];

        NSMutableArray *Objects_Subjectcount = [NSMutableArray new];
        for (NSInteger i = 0; i < subjects; i++) 
            [Objects_Subjectcount addObject:@@"level":@(0), @"isChild":@(YES)];
        
        [object setObject:Objects_Subjectcount forKey:@"Objects_Subjectcount"];

    
    [objects addObject:object];


NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = paths.firstObject;
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"File.plist"];
NSError *writeError = nil;
NSDictionary *finalDict = @@"Objects": objects;
NSData *plistData = [NSPropertyListSerialization dataWithPropertyList:finalDict format:NSPropertyListXMLFormat_v1_0 options:NSPropertyListImmutable error:&writeError];
if(plistData)
    [plistData writeToFile:plistPath atomically:YES];

else 
    NSLog(@"Error in saveData: %@", error);

【讨论】:

我需要在Json数据加载之后添加两个手动值上面提到的红色标记值我需要在json数据存储之后添加。@bunty 你能帮帮我吗?我需要在加载 JSON 数据后添加两个键! 我刚刚改了答案,希望你能得到想要的结果。 @bunty 很抱歉打扰您如果您在我的代码中进行了修改,我很容易理解! 我复制了整个代码,包括我的更改。

以上是关于需要使用 Objective C 将新的键和值添加到 Plist 中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用循环的情况下在 PHP 中向多维添加新的键和值......?

ConcurrentDictionary操作

Map里面的键和值可以为空吗

如何交换散列中的键和值

在 Objective C 中搜索函数

删除 NSDictionaries 中超过 100.000 公里的键和值