Добавление данных в PLIST — iPhone

нам нужно иметь возможность читать содержимое существующего файла plist, затем добавлять в массив/словарь, а затем записывать эти новые данные в файл plist. Стройка простая. Нам нужны несколько корневых ключей в виде массивов, каждый из которых имеет несколько значений. Структура выглядит так,

124818240124810284.JPG          Array
                item 0          String     Some Attribute 1
                item 1          String     Some Attribute 2

Пока мы можем создать вышеперечисленное без проблем. Но как только мы переходим к записи другого массива в plist, файл просто перезаписывается и все текущее содержимое теряется. Что нам нужно сделать, так это прочитать вышеизложенное и добавить к нему, чтобы мы получили что-то вроде этого,

124818240124810284.JPG          Array
                item 0          String     Some Attribute 1
                item 1          String     Some Attribute 2
354273577823597297.JPG          Array
                item 0          String     Some Attribute 1
                item 1          String     Some Attribute 2

И так далее. Мы в растерянности и боремся с этим уже день. Пожалуйста, помогите, чем можете! Заранее спасибо!!

В настоящее время мы пишем этот файл следующим образом

NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Gallery.plist"];

// set the variables to the values in the text fields
NSMutableArray *myPhotos = [[NSMutableArray alloc] initWithCapacity:2];
[myPhotos addObject:@"NO"];
[myPhotos addObject:@"NO"];


// create dictionary with values in UITextFields
NSDictionary *plistDict = [NSDictionary dictionaryWithObjects: [NSArray  arrayWithObjects: myPhotos, nil] forKeys:[NSArray arrayWithObjects: self.photoName, nil]];

NSString *error = nil;

// create NSData from dictionary
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];

// check is plistData exists
if(plistData) {
    // write plistData to our Data.plist file
        [plistData writeToFile:plistPath atomically:YES];
}else{
        NSLog(@"Error in saveData: %@", error);
        [error release];
}

Ниже показано, что у нас получилось

NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"Gallery.plist"];

// Get current content.
NSDictionary *oldContent = [NSDictionary dictionaryWithContentsOfFile:plistPath];
// Make a mutable copy.
NSMutableDictionary *newContent = [[oldContent mutableCopy] autorelease];
// Add new stuff.

NSMutableArray *myPhotos = [[NSMutableArray alloc] initWithCapacity:2];
[myPhotos addObject:@"Attribute 1"];
[myPhotos addObject:@"Attribute 2"];

[newContent setObject:myPhotos forKey:self.filePath];

// Now, write the plist:
[newContent writeToFile:plistPath atomically:YES];

person mejim707    schedule 16.01.2012    source источник
comment
Итак, по сути, у вас возникли проблемы с добавлением еще одной записи в массив? Псевдокод: array = [self readPlist]; array = [array arrayByAppendingObject:newEntry]; [self writePlist:array]; Это то, что вы хотите сделать?   -  person DarkDust    schedule 16.01.2012
comment
По сути, да, но у нас возникли проблемы с созданием изменяемого массива, добавлением к нему данных, а затем записью этого. Я хотел бы опубликовать, как мы сейчас пишем файл, если это поможет   -  person mejim707    schedule 16.01.2012
comment
Да, пожалуйста, отредактируйте свой вопрос и опубликуйте код, который вызывает проблемы.   -  person DarkDust    schedule 16.01.2012
comment
Эээ, вы даже не читаете оригинал исходного списка...   -  person DarkDust    schedule 16.01.2012
comment
Я только что опубликовал код, который мы используем для записи данных в plist. Опять же, это работает отлично. Вы можете увидеть добавление нескольких объектов, а затем указать, что эти объекты должны быть связаны со значением ключа self.photoName. Все хорошо, но нам нужно прочитать в текущем списке и добавить к нему что-то из вышеперечисленного. Спасибо!   -  person mejim707    schedule 16.01.2012


Ответы (2)


Вы делаете это так:

// Get current content.
NSDictionary *oldContent = [NSDictionary dictionaryWithContentsOfFile:plistPath];
// Make a mutable copy.
NSMutableDictionary *newContent = [[oldContent mutableCopy] autorelease];
// Add new stuff.
[newContent setObject:newObject forKey:newKey];
// Now, write the plist:
[newContent writeToFile:plistPath atomically:YES];

Здесь вообще не нужно использовать NSPropertyListSerialization.

person DarkDust    schedule 16.01.2012
comment
Это сработало! Я опубликую в своем вопросе код, который я получил, чтобы сделать это. Спасибо большое и всем за оперативные ответы!! - person mejim707; 16.01.2012

У вас есть словарь для начала,

124818240124810284.JPG //[valueForKey: 124818240124810284.JPG] 



                    item 0          String     Some Attribute 1 //[valueForKey:124818240124810284.JPG] valueForKey:Item 0];
                    item 1          String     Some Attribute 2 //[valueForKey:124818240124810284.JPG] valueForKey:Item 1];


    354273577823597297.JPG    //[valueForKey: 354273577823597297.JPG]    
                    item 0          String     Some Attribute 1 //[valueForKey: 354273577823597297.JPG] valueForKey:Item 0];
                    item 1          String     Some Attribute 2 //[valueForKey: 354273577823597297.JPG] valueForKey:Item 1;

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

 NSMutableDictionary *newAttributes = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Attribute 0",@"Item 0",nil];

Создайте новый словарь:

   NSMutableDictionary *newEntry = [[NSMutableDictionary alloc]initWithObjectsAndKeys:newAttributes,@"xxxxx.jpg", nil];//Makes a new dictionary

Или добавить данные в существующий словарь:

[dictionaryToAppend setValue:newAttribues ForKey:xxxxx.jpg"];
person Hubert Kunnemeyer    schedule 16.01.2012