С листом, содержащим массив массивов словарей, как вы добавляете и записываете новые элементы словаря - PullRequest
0 голосов
/ 24 июня 2011

Я создал 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 Data или как добавлять новыеЭлементы массива словаря, а затем запишите их обратно в список.

Итак, учитывая следующий код в качестве отправной точки, как мне завершить этот код, чтобы добавить элементы массива и элементы словаря, описанные выше:

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 Ответ

1 голос
/ 24 июня 2011

ок, после пробной ошибки я выясняю, как это сделать.Во-первых, позвольте мне дать определение сохраняемым данным.Данные для всех военнослужащих, которые имеют почасовой и не почасовой статус.«Почасовые данные» и «Нечасовые данные» считаются массивами уровня 1.Элементы массивов уровня 1 называются массивами уровня 2.Массивы уровня 2 можно рассматривать как страну, в которой служили армейцы. Массивы уровня 2 имеют элементы, которые являются словарями.Каждый из словарей описывает ArmyPerson.

Теперь для ответа, в основном мне нужно работать изнутри и создать массив словарей 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...