Recentemente, tenho tentado armazenar os resultados da pesquisa do meu aplicativo para iPhone na coleção NSUserDefaults. Eu também uso isso para salvar as informações de registro do usuário com êxito, mas, por algum motivo, tentar armazenar meu NSMutableArray de classes de localização personalizadas sempre volta vazio.
Tentei converter o NSMutableArray em um elemento NSData a partir desta postagem, mas obtenho o mesmo resultado (é possível salvar uma matriz inteira usando NSUserDefaults no iPhone? )
Os exemplos de código que experimentei são:
Salve :
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
ou
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
ou
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
Carga:
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
ou
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
ou
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Depois de seguir os conselhos abaixo, também implementei o NSCoder em meu objeto (ignore o uso excessivo de NSString, seu temporário):
#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"];
}
fonte
andSync
você adicionou ao código acima? Essa não é uma assinatura de método real para NSUserDefaults. Além disso,synchronize
não é tão útil quanto antes: twitter.com/Catfish_Man/status/647274106056904704Acho que você obteve um erro no seu método initWithCoder, pelo menos no código fornecido você não retorna o objeto 'self'.
eu uso
e
e funciona perfeitamente para mim.
Atenciosamente,
Stefan
fonte
Acho que parece que o problema com o seu código não é salvar a matriz de resultados. Está carregando os dados, tente usar
Isso retornará a matriz especificada pela chave.
fonte
Consulte "Por que NSUserDefaults falhou ao salvar NSMutableDictionary no iPhone SDK?" ( Por que NSUserDefaults falhou ao salvar NSMutableDictionary no iPhone SDK? )
Se você deseja (des) serializar objetos personalizados, é necessário fornecer as funções para (des) serializar os dados (protocolo NSCoding). A solução à qual você se refere funciona com o array int porque o array não é um objeto, mas um bloco contíguo de memória.
fonte
Eu não recomendaria tentar armazenar coisas como essa no banco de dados padrão.
SQLite é bastante fácil de aprender e usar. Eu tenho um episódio em um dos meus screencasts ( http://pragprog.com/screencasts/v-bdiphone ) sobre um invólucro simples que escrevi (você pode obter o código sem comprar o SC).
É muito mais limpo armazenar dados de aplicativos no espaço de aplicativos.
Dito isso, se ainda faz sentido colocar esses dados no banco de dados padrão, consulte o post f3lix postado.
fonte