Как ОБНОВИТЬ и УДАЛИТЬ строковые элементы и целые элементы словаря из списка - PullRequest
1 голос
/ 11 декабря 2010
Root ---- Array
  Item 0- Dictionary
    fullName ---- String
    address ---- String
  Item 1 ---- Dictionary
    fullName ---- String
    address ---- String

У меня следующая структура списка.

Q1 Как мне ОБНОВИТЬ / изменить fullName в коде после того, как он уже был сохранен в файле plist?

Q2 Как УДАЛИТЬ только один элемент словаря, скажем, в примере выше, элемент 0?

Я использую Навигационный контроллер TableView с подробным примером.

Спасибо

Ответы [ 2 ]

4 голосов
/ 11 декабря 2010

Вы не обновляете и не удаляете что-либо из файла plist.Это немного сложнее:

  1. Считать файл plist в память
  2. Изменить версию в памяти
  3. Записать новую версию обратно на диск

Чтение в списках довольно тривиально.В вашем случае, поскольку корневой элемент является массивом, вы должны сделать:

NSMutableArray * plistContents = [NSMutableArray arrayWithContentsOfFile:plistFilePath];

Здесь мы создаем изменяемый массив, поскольку мы знаем, что мы собираемся что-то изменить в нем.Если мы просто хотим прочитать информацию, мы должны использовать NSArray вместо NSMutableArray.

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

//delete the first dictionary:
[plistContents removeObjectAtIndex:0];

//Change a dictionary's full name:
NSMutableDictionary * firstDictionary = [[plistContents objectsAtIndex:0] mutableCopy];
[firstDictionary setObject:@"Mike" forKey:@"fullName"];
[plistContents replaceObjectAtIndex:0 withObject:firstDictionary];
[firstDictionary release];

Здесь мы должны сделать изменяемую (изменяемую) копию словаря, так как чтение в plist создает только неизменный NSDictionary.Таким образом, мы копируем словарь, изменяем значение, которое мы хотим изменить, а затем заменяем исходный словарь нашим новым измененным словарем.

Запись списка на диск также проста:

//be sure you have write-permissions first!
[plistContents writeToFile:plistFilePath atomically:YES];
1 голос
/ 11 декабря 2010

Вы не работаете с данными, хранящимися в plist напрямую, вы сериализуете объекты или не сериализуете объекты из plist. Поскольку вы хотите изменить данные, вам необходимо десериализовать изменяемые объекты. NSPropertyListSerialization s propertyListWithData:options:format:error: будет десериализовать plist, создавая изменяемые коллекции, когда вы используете NSPropertyListMutableContainers или NSPropertyListMutableContainersAndLeaves опция.

NSError *err=nil;
NSData *raw = [[NSData alloc] initWithContentsOfFile:path];
id stuff = [NSPropertyListSerialization
                   propertyListWithData:raw
                                options:NSPropertyListMutableContainers 
                                 format:NULL
                                  error:&err;
      ];
if (err) {
    // couldn't parse the plist; handle the error.
    ...
    [err release];
}
[raw release];

Это даст вам вложенную коллекцию NSMutableArray с, NSMutableDictionary с, NSString с или NSMutableString с (в зависимости от того, указали ли вы NSPropertyListMutableContainers или NSPropertyListMutableContainersAndLeaves) и т. Д. После того, как вы не сериализовали plist, используйте любой метод, который предоставляет коллекция для удаления (например, NSMutableArray s removeObjectAtIndex:, NSMutableDictionary 's removeObjectForKey:) или установите (например, replaceObjectAtIndex:withObject:, setObject:forKey:) позиций.

Подробнее см. Руководство по программированию списка свойств .

...