2009-09-28 12 views
21

Chciałbym zapisać NSArray jako plik lub ewentualnie użyć domyślnych ustawień użytkownika. Oto, co mam nadzieję zrobić.Zapisywanie NSArray

  1. Odzyskaj już zapisaną NSArray (jeśli istnieje).
  2. Zrób coś z tym.
  3. Wymaż zapisane dane (jeśli występują).
  4. Zapisz NSArray.

Czy to możliwe, a jeśli tak, jak mam to zrobić?

Odpowiedz

38

NSArray oferuje dwie metody aby dokładnie to, co chcesz: initWithContentsOfFile: i writeToFile:atomically:

Krótki Przykładem może wyglądać następująco:

//Creating a file path under iOS: 
//1) Search for the app's documents directory (copy+paste from Documentation) 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
//2) Create the full file path by appending the desired file name 
NSString *yourArrayFileName = [documentsDirectory stringByAppendingPathComponent:@"example.dat"]; 

//Load the array 
NSMutableArray *yourArray = [[NSMutableArray alloc] initWithContentsOfFile: yourArrayFileName]; 
if(yourArray == nil) 
{ 
    //Array file didn't exist... create a new one 
    yourArray = [[NSMutableArray alloc] initWithCapacity:10]; 

    //Fill with default values 
} 
... 
//Use the content 
... 
//Save the array 
[yourArray writeToFile:yourArrayFileName atomically:YES]; 
+0

Dzięki! Jedno pytanie "writeToFile:" utworzy nowy plik z tablicą w Specified Path? – Joshua

+1

Tak. Jedno zastrzeżenie: Tablica musi być poprawną listą właściwości, co oznacza, że ​​cała jej zawartość (i jej zawartość, w stosownych przypadkach) również muszą być listami właściwości. –

+0

Rozumiem, że powinno być dobrze. Tak więc, kiedy ładuję tablicę z 'initWithContentsOfFile:' czy muszę podać ścieżkę bezpośrednio do pliku, a jeśli tak, to w jaki sposób będzie on wywoływany? – Joshua

1

Ten problem wydaje się być najbardziej odpowiedni dla danych podstawowych, ponieważ zajmie się wszystkimi stałymi danymi obiektu. Gdy pobierzesz twoje dane, zwrócisz NSSet, który jest nieposortowany, więc będziesz musiał mieć jakiś sposób sortowania danych w tablicy, na przykład unikalny numer identyfikacyjny assocaited z każdym tworzonym obiektem.

13

Można wdrożyć NSCoding na obiektach tablica zawiera i użyj NSKeyedArchiver do serializowania/deserializacji twojej tablicy na dysk.

BOOL result = [NSKeyedArchiver archiveRootObject:myArray toFile:path]; 

archiwizatora będzie odroczyć do realizacji NSCoding uzyskać wartości SERIALIZABLE od każdego obiektu i zapisu pliku, który można odczytać z NSKeyedUnarchiver:

id myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

Więcej informacji w serialization guide.

+1

Tak. Chciałem dodać, że ten sposób musi być użyty, jeśli tablica zawiera dane nie będące właściwościami PropertyList (patrz odpowiedź Racha dla przyjaznych danych PropertyList). –