使用包含字典数组数组的plist,如何添加和写出新的字典元素

时间:2011-06-23 20:09:23

标签: objective-c ios plist

我创建了一个plist,它被初始化为一个字典数组数组。 plist存储动态数据。因此,当应用程序终止时,可能会添加新的词典元素。或者可能有新的字典元素数组要添加。之后,可能会有更少的字典元素,因此不再需要以前的元素。虽然有很多关于向plist添加元素的讨论,但似乎都没有解决我的问题。这是最初的plist描述:

Key                  Type         Value
Root                 Dictionary   (2 items)
  Hourly Data        Array        (1 item)
     Item 0          Array        (1 item)      <--how do I add more of these
        Item 0       Dictionary   (3 items)     <--how do I add more of these
           Name      String       Joe
           Rank      String       private
           serialNo  String       123456
  NonHourly Data     Array        (1 item)
     Item 0          Array        (1 item)
        Item 0       Dictionary   (3 items)
           Name      String       Jeff
           Rank      String       private
           serialNo  String       654321

虽然我完全理解如何读取这个plist文件,但我不明白如何将数组元素添加到Hourly和NonHourly数据数组中,或者如何添加新的Dictionary数组项,然后将它们写回到plist文件中

所以给出以下代码作为起点,如何完成此代码以添加上述数组元素和字典元素:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   // Create a list of paths
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *configPlist = [documentsDirectory stringByAppendingPathComponent:@"config.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];

NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile: configPlist];

...

[data writeToFile: configPlist atomically:YES];

1 个答案:

答案 0 :(得分:1)

好吧,经过试验错误,我想出了如何做到这一点。首先,让我为存储的数据提供定义。该数据适用于所有具有小时和非小时状态的军人。 “每小时数据”和“非每小时数据”被认为是1级数组。 1级数组的元素称为2级数组。 2级阵列可以被认为是军队所服务的国家.2级阵列具有字典元素。每个词典都描述了一个军队人员。

现在回答,基本上我需要从内到外工作,并创建一个包含要存储的数据的二级字典数组。然后将该2级数组添加到1级数组。最后,1级数组作为对象存储在每小时数据或plist的非每小时数据键中。这是解决方案:

// Create an array of arrays of content encoded as dictionary objects for hourly data
armyPerson *aPerson;
NSArray *level1Element;
NSMutableArray *level2Array;    
NSMutableArray *level1Array = [[[NSMutableArray alloc] initWithObjects:nil] autorelease];
for (int i=0; i<[allHourlyPersons count]; i++) {
    level1Element = [allHourlyPersons objectAtIndex:i]; // grab the next level1 array element. 

    // Each level1 array element will have zero or more level2Arrays. The info for each level2 dictionary needs to be collected into
    // an level2Array element as individual dictionary objects
    level2Array = [[[NSMutableArray alloc] initWithObjects:nil] autorelease];   // initialize the level2Array
    for (int j=0; j<[level1Element count]; j++) {
        aPerson = [level1Element objectAtIndex:j];  // grab the next armyPerson

        // For each episode, create a dictionary object
        NSDictionary *level2Element = [NSDictionary dictionaryWithObjectsAndKeys:aPerson.name, @"Name", 
                                                                                    aPerson.rank, @"Rank",
                                                                                    aPerson.serialNo, @"serialNo", nil];
        [level2Array addObject:level2Element];  // save the info for this episode
    }

    // Now that we have all the episodes for this level1Element collected into an array of dictionary objects,
    // we need to add this array to the level1 array
    [level1Array addObject:level2Array];
}

// Finally, we need to create the key-value pair for the hourly source array
[data setObject:level1Array forKey:@"Hourly Data"];

...
Do the same for the Non-Hourly Data prior to:

[data writeToFile: configPlist atomically:Yes];