Ostatnio próbowałem przechowywać wyniki wyszukiwania mojej aplikacji na iPhone'a w kolekcji NSUserDefaults. Używam tego również do pomyślnego zapisania informacji o rejestracji użytkownika, ale z jakiegoś powodu próba zapisania mojej NSMutableArray niestandardowych klas lokalizacji zawsze jest pusta.
Próbowałem przekonwertować NSMutableArray na element NSData od tego postu, ale otrzymuję ten sam wynik (Czy można zapisać tablicę liczb całkowitych za pomocą NSUserDefaults na iPhonie? )
Próbki kodu, które wypróbowałem, to:
Zapisać:
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
lub
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
lub
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
Załaduj:
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
lub
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
lub
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Po poniższych poradach zaimplementowałem również NSCoder w moim obiekcie (zignoruj nadużywanie NSString jego tymczasowego):
#import "Location.h"
@implementation Location
@synthesize locationId;
@synthesize companyName;
@synthesize addressLine1;
@synthesize addressLine2;
@synthesize city;
@synthesize postcode;
@synthesize telephoneNumber;
@synthesize description;
@synthesize rating;
@synthesize priceGuide;
@synthesize latitude;
@synthesize longitude;
@synthesize userLatitude;
@synthesize userLongitude;
@synthesize searchType;
@synthesize searchId;
@synthesize distance;
@synthesize applicationProviderId;
@synthesize contentProviderId;
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
self.locationId = [coder decodeObjectForKey:@"locationId"];
self.companyName = [coder decodeObjectForKey:@"companyName"];
self.addressLine1 = [coder decodeObjectForKey:@"addressLine1"];
self.addressLine2 = [coder decodeObjectForKey:@"addressLine2"];
self.city = [coder decodeObjectForKey:@"city"];
self.postcode = [coder decodeObjectForKey:@"postcode"];
self.telephoneNumber = [coder decodeObjectForKey:@"telephoneNumber"];
self.description = [coder decodeObjectForKey:@"description"];
self.rating = [coder decodeObjectForKey:@"rating"];
self.priceGuide = [coder decodeObjectForKey:@"priceGuide"];
self.latitude = [coder decodeObjectForKey:@"latitude"];
self.longitude = [coder decodeObjectForKey:@"longitude"];
self.userLatitude = [coder decodeObjectForKey:@"userLatitude"];
self.userLongitude = [coder decodeObjectForKey:@"userLongitude"];
self.searchType = [coder decodeObjectForKey:@"searchType"];
self.searchId = [coder decodeObjectForKey:@"searchId"];
self.distance = [coder decodeObjectForKey:@"distance"];
self.applicationProviderId = [coder decodeObjectForKey:@"applicationProviderId"];
self.contentProviderId = [coder decodeObjectForKey:@"contentProviderId"];
}
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:locationId forKey:@"locationId"];
[coder encodeObject:companyName forKey:@"companyName"];
[coder encodeObject:addressLine1 forKey:@"addressLine1"];
[coder encodeObject:addressLine2 forKey:@"addressLine2"];
[coder encodeObject:city forKey:@"city"];
[coder encodeObject:postcode forKey:@"postcode"];
[coder encodeObject:telephoneNumber forKey:@"telephoneNumber"];
[coder encodeObject:description forKey:@"description"];
[coder encodeObject:rating forKey:@"rating"];
[coder encodeObject:priceGuide forKey:@"priceGuide"];
[coder encodeObject:latitude forKey:@"latitude"];
[coder encodeObject:longitude forKey:@"longitude"];
[coder encodeObject:userLatitude forKey:@"userLatitude"];
[coder encodeObject:userLongitude forKey:@"userLongitude"];
[coder encodeObject:searchType forKey:@"searchType"];
[coder encodeObject:searchId forKey:@"searchId"];
[coder encodeObject:distance forKey:@"distance"];
[coder encodeObject:applicationProviderId forKey:@"applicationProviderId"];
[coder encodeObject:contentProviderId forKey:@"contentProviderId"];
}
źródło
andSync
który dodałeś do powyższego kodu? To nie jest rzeczywista sygnatura metody dla NSUserDefaults. Poza tymsynchronize
nie jest tak użyteczny jak kiedyś: twitter.com/Catfish_Man/status/647274106056904704Myślę, że wystąpił błąd w metodzie initWithCoder, przynajmniej w dostarczonym kodzie nie zwraca się obiektu „self”.
używam
i
i działa idealnie dla mnie.
Z pozdrowieniami,
Stefan
źródło
Wydaje mi się, że problem z twoim kodem nie polega na zapisaniu tablicy wyników. Jego ładowanie danych spróbuj użyć
To zwróci tablicę określoną przez klucz.
źródło
Zobacz „Dlaczego NSUserDefaults nie mógł zapisać NSMutableDictionary w iPhone SDK?” ( Dlaczego NSUserDefaults nie zapisał NSMutableDictionary w iPhone SDK? )
Jeśli chcesz (de) serializować obiekty niestandardowe, musisz dostarczyć funkcje do (de) serializacji danych (protokół NSCoding). Rozwiązanie, do którego się odwołujesz, działa z tablicą int, ponieważ tablica nie jest obiektem, ale ciągłym fragmentem pamięci.
źródło
Odradzałbym przechowywanie takich rzeczy w domyślnej bazie danych.
SQLite jest dość łatwy do pobrania i użycia. Mam odcinek w jednym z moich screencastów ( http://pragprog.com/screencasts/v-bdiphone ) o prostym opakowaniu, które napisałem (możesz pobrać kod bez kupowania SC).
Przechowywanie danych aplikacji w przestrzeni aplikacji jest znacznie czystsze.
Wszystko to powiedziawszy, jeśli nadal ma sens umieszczanie tych danych w domyślnej bazie danych, zobacz post opublikowany przez f3lix.
źródło