Ich habe kürzlich versucht, die Suchergebnisse meiner iPhone-App in der NSUserDefaults-Sammlung zu speichern. Ich verwende dies auch, um Benutzerregistrierungsinformationen erfolgreich zu speichern, aber aus irgendeinem Grund ist der Versuch, mein NSMutableArray mit benutzerdefinierten Standortklassen zu speichern, immer leer.
Ich habe versucht, das NSMutableArray ab diesem Beitrag in ein NSData-Element zu konvertieren, erhalte jedoch das gleiche Ergebnis ( Kann ein ganzzahliges Array mit NSUserDefaults auf dem iPhone gespeichert werden? )
Die Codebeispiele, die ich ausprobiert habe, sind:
Sparen:
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
oder
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
oder
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
Belastung:
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
oder
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
oder
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Nachdem ich die folgenden Ratschläge befolgt habe, habe ich auch NSCoder in mein Objekt implementiert (ignorieren Sie die vorübergehende Überbeanspruchung von NSString):
#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"];
}
quelle
andSync
Sie dem obigen Code hinzugefügt haben? Dies ist keine tatsächliche Methodensignatur für NSUserDefaults. Auchsynchronize
ist nicht mehr so nützlich wie früher: twitter.com/Catfish_Man/status/647274106056904704Ich denke, Sie haben einen Fehler in Ihrer initWithCoder-Methode erhalten, zumindest im bereitgestellten Code geben Sie das 'self'-Objekt nicht zurück.
ich benutze
und
und es funktioniert perfekt für mich.
Mit freundlichen Grüßen
Stefan
quelle
Ich denke, es sieht so aus, als ob das Problem mit Ihrem Code nicht darin besteht, das Ergebnisarray zu speichern. Es wird versucht, die Daten zu laden
Dies gibt das durch den Schlüssel angegebene Array zurück.
quelle
Siehe "Warum konnte NSUserDefaults NSMutableDictionary nicht im iPhone SDK speichern?" ( Warum konnte NSUserDefaults NSMutableDictionary nicht im iPhone SDK speichern? )
Wenn Sie benutzerdefinierte Objekte (de) serialisieren möchten, müssen Sie die Funktionen zum (de) serialisieren der Daten (NSCoding-Protokoll) bereitstellen. Die Lösung, auf die Sie sich beziehen, funktioniert mit dem int-Array, da das Array kein Objekt, sondern ein zusammenhängender Speicherblock ist.
quelle
Ich würde davon abraten, solche Dinge in der Standard-Datenbank zu speichern.
SQLite ist ziemlich einfach zu erlernen und zu verwenden. Ich habe eine Episode in einem meiner Screencasts ( http://pragprog.com/screencasts/v-bdiphone ) über einen einfachen Wrapper, den ich geschrieben habe (Sie können den Code erhalten, ohne den SC zu kaufen).
Es ist viel sauberer, App-Daten im App-Bereich zu speichern.
Alles, was gesagt wurde, wenn es immer noch Sinn macht, diese Daten in die Standarddatenbank zu stellen, dann lesen Sie den Beitrag f3lix veröffentlicht.
quelle