Добавяне на данни към 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
Хм, вие дори не четете оригинала, оригиналния plist...   -  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