Recientemente he intentado almacenar los resultados de búsqueda de mi aplicación de iPhone en la colección NSUserDefaults. También utilizo esto para guardar la información de registro del usuario con éxito, pero por alguna razón, intentar almacenar mi NSMutableArray de clases de ubicación personalizadas siempre vuelve vacío.
Intenté convertir NSMutableArray en un elemento NSData a partir de esta publicación, pero obtengo el mismo resultado (¿Es posible guardar una matriz de enteros usando NSUserDefaults en iPhone? )
Los ejemplos de código que he probado son:
Salvar:
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
o
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
o
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
Carga:
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
o
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
o
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Después de seguir los consejos a continuación, también he implementado NSCoder en mi objeto (ignore el uso excesivo de NSString es temporal):
#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"];
}
fuente
andSync
que agregaste al código anterior? Esa no es una firma de método real para NSUserDefaults. Además,synchronize
no es tan útil como antes: twitter.com/Catfish_Man/status/647274106056904704Creo que ha recibido un error en su método initWithCoder, al menos en el código proporcionado no devuelve el objeto 'self'.
yo suelo
y
y funciona perfecto para mí.
Con saludos,
Stefan
fuente
Creo que parece que el problema con su código no es guardar la matriz de resultados. Está cargando los datos, intente usar
Esto devolverá la matriz especificada por la clave.
fuente
Consulte "¿Por qué NSUserDefaults no pudo guardar NSMutableDictionary en iPhone SDK?" ( ¿Por qué NSUserDefaults no pudo guardar NSMutableDictionary en iPhone SDK? )
Si desea (des) serializar objetos personalizados, debe proporcionar las funciones para (des) serializar los datos (protocolo NSCoding). La solución a la que hace referencia funciona con la matriz int porque la matriz no es un objeto, sino una porción contigua de memoria.
fuente
Recomendaría no intentar almacenar cosas como esta en la base de datos predeterminada.
SQLite es bastante fácil de aprender y usar. Tengo un episodio en uno de mis screencasts ( http://pragprog.com/screencasts/v-bdiphone ) sobre una envoltura simple que escribí (puede obtener el código sin comprar el SC).
Es mucho más limpio almacenar datos de aplicaciones en el espacio de aplicaciones.
Dicho todo esto, si todavía tiene sentido poner estos datos en la base de datos predeterminada, vea la publicación f3lix publicada.
fuente