2012-06-07 16 views
8

Pracuję nad czytnikiem rss. To tylko widok tabeli, a każda komórka pokazuje niestandardowy model danych RSSEntry. I mam NSMutableArray allEntries, który zawiera wszystkie RSSEntry, które dostałem z serwera. To co RSSEntry wygląda następująco:Używanie NSKeyedArchiver do przechowywania własnego modelu danych

@interface RSSEntry : NSObject <NSCoding> { 
     NSString *_blogTitle; 
     NSString *_articleTitle; 
     NSString *_articleUrl; 
     NSDate *_articleDate; 
    } 

Chcę przywrócić dane z lokalnego archiwum więc kiedy zamknąć i otworzyć aplikację kolejny tableview jest wypełniona danych podczas ostatniego odświeżenia.

Przeczytałem przykład w "Początku programowania w systemie iOS5", ale zapisuje i odtwarza tylko jeden model danych. Tak więc nie wiem, jak przechowywać tę zmienną tablicę pełną mojego niestandardowego modelu danych i przywrócić go.

Używam następujący kod do przechowywania i przywracania danych:

// STORE 
NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:entry forKey:kDataKey]; 
[archiver finishEncoding]; 

// RESTORE 
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath:kFilename]]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
RSSEntry *entries = [unarchiver decodeObjectForKey:kDataKey]; 
[unarchiver finishDecoding]; 

mogę tylko przechowywania i przywracania danych w jednym modelu w ten sposób.

Kto może mi pomóc. Jestem początkującym programistom na iOS, może to trochę nudne .sorry.

Odpowiedz

14

umieścić wszystkie dane, które chcesz zapisać na na NSArray i użyć tego kodu:

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:entries]; 

Gdzie entries to tablica wpisów. Ładne i łatwe, tylko jedna linia kodu.

do Zdezarchiwizuj, wystarczy użyć

NSArray *entries = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSKeyedArchiver może archiwizowanie struktury danych, nawet bardzo złożony, w celu C obiektów , które realizują protokółNSCoding, zagnieżdżonych NSArray s, NSDictionary s, a niestandardowe obiekty do pliku. NSKeyedUnarchiver działa odwrotnie, pobierając wszelkie dane wygenerowane przez NSKeyedArchiver i ponownie ustanawiając pierwotny wykres obiektów, który został zarchiwizowany. Z technicznego punktu widzenia, mogą one być pojedynczą klasą, ale Apple zdecydowało się na oddzielenie ich funkcjonalnością, ponieważ jest to bardziej poprawne gramatycznie lub coś :)

Zakładam, że jesteś w stanie zapisać wynikowy obiekt NSData w pliku i przeczytać go z powrotem.

+0

Nie wiem dlaczego, ale ta odpowiedź działa, gdy wszystkie inne, które wydają się identyczne, nie - dzięki –

3

Mogłeś przechowywać NSDictionary następująco

NSDictionary *Your_NSDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
           @"Obj1", @"Key1", 
           @"Obj2", @"Key2", nil]; 
//store dictionary 
NSMutableData *yourData = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:yourData]; 
[archiver encodeObject:Your_NSDictionary forKey: @"key"]; 
archiver finishEncoding]; 
[yourData writeToFile:@"FilePath" atomically:YES]; 
[yourData release]; 
[archiver release]; 


//Load dictionary 

NSData *yourData = [[NSMutableData alloc]initWithContentsOfFile:@"FilePath"]; 
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:yourData]; 
Your_NSDictionary = [unarchiver decodeObjectForKey: @"key"]; 
[unarchiver finishDecoding]; 
[unarchiver release]; 
[yourData release]; 
Powiązane problemy