2009-10-19 18 views
5

W mojej aplikacji na iPhone'a mam dwa pliki plist do przechowywania "Motywów". Jeden to plik tylko do odczytu zawierający domyślne motywy, a jeden zawiera niestandardowe motywy utworzone przez użytkownika. Używam plików plist, ponieważ bardzo łatwo jest mi odczytać z plist i utworzyć nowe obiekty Theme.Jak dołączyć nowy element do pliku plist?

Mój plist to tablica obiektów słownikowych.

Czy istnieje łatwy sposób dodania nowego obiektu słownika do mojego pliku plist? Czy muszę odczytać plik w pamięci, dołączyć nowy obiekt słownika i zapisać go w systemie plików?

Dzięki!

+0

To jest prosta droga. Na co jeszcze masz nadzieję? –

+1

Przekopałem się po dokumentach, aby zobaczyć, czy czegoś mi brakuje, na przykład w metodach ułatwiających mutację plistów, ponieważ są one tak szeroko stosowane w aplikacjach Cocoa. Zgadnij, nie :) –

Odpowiedz

5

Za pomocą kakao należy przeczytać plik w pamięci, dołączyć nowy obiekt słownika i zapisać go w systemie plików. Jeśli użyjesz plistu XML, możesz łatwo sparsować go i stopniowo zapisywać do pliku, ale będzie on również nieco większy, więc jest mało prawdopodobne, by był tego wart.

Jeśli przepisywanie pliku plist zajmuje zbyt dużo czasu, należy zbadać użycie bazy danych (np. Za pomocą danych podstawowych). O ile plik nie jest ogromny, wątpię, że będzie to problemem nawet przy pojemności pamięci iPhone'a i prędkości zapisu flash.

+0

To wystarczy! Dzięki. –

+0

Pamiętaj tylko, że nie możesz pisać do pakietu aplikacji. Musisz znaleźć katalog dokumentów swojej aplikacji (użyj 'NSSearchPathForDirectoriesInDomain()') i zapisz go tam. –

3

(skopiowałem to dla tych, którzy nie chcą, aby kliknąć link z podobnym pytaniem ja tu odpowiedzi: A question on how to Get data from plist & how should it be layout)

Oto dwie metody do odczytu i zapisu wartości z plist przy użyciu NSDictionary:

- (NSMutableDictionary*)dictionaryFromPlist { 
    NSString *filePath = @"myPlist.plist"; 
    NSMutableDictionary* propertyListValues = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
    return [propertyListValues autorelease]; 
} 

- (BOOL)writeDictionaryToPlist:(NSDictionary*)plistDict{ 
    NSString *filePath = @"myPlist.plist"; 
    BOOL result = [plistDict writeToFile:filePath atomically:YES]; 
    return result; 
} 

a następnie w bloku kodu gdzieś:

// Read key from plist dictionary 
NSDictionary *dict = [self dictionaryFromPlist]; 
NSString *valueToPrint = [dict objectForKey:@"Executable file"]; 
NSLog(@"valueToPrint: %@", valueToPrint); 

// Write key to plist dictionary 
NSString *key = @"Icon File"; 
NSString *value = @"appIcon.png"; 
[dict setValue:value forKey:key]; 

// Write new plist to file using dictionary 
[self writeDictionaryToPlist:dict]; 
3

to jak ja dołączanie danych do plist:

NSString *filePath = [self dataFilePath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 
    [array addObject:countdownLabel.text]; 
    [array writeToFile:[self dataFilePath] atomically:YES]; 
    [array release]; 
} 
else 
{ 
    NSArray *array = [NSArray arrayWithObject:countdownLabel.text]; 
    [array writeToFile:filePath atomically:YES]; 
}