Saya baru-baru ini mencoba menyimpan hasil pencarian aplikasi iPhone saya di koleksi NSUserDefaults. Saya juga menggunakan ini untuk menyimpan info pendaftaran pengguna dengan sukses, tetapi untuk beberapa alasan mencoba menyimpan NSMutableArray kelas Lokasi khusus saya selalu kembali kosong.
Saya mencoba mengubah NSMutableArray ke elemen NSData pada posting ini tetapi saya mendapatkan hasil yang sama ( Mungkin untuk menyimpan array integer menggunakan NSUserDefaults di iPhone? )
Contoh kode yang sudah saya coba adalah:
Menyimpan:
[prefs setObject:results forKey:@"lastResults"];
[prefs synchronize];
atau
NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];
[prefs setObject:data forKey:@"lastResults"];
atau
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];
[prefs setObject:data forKey:@"lastResults"];
Beban:
lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];
atau
NSData *data = [prefs objectForKey:@"lastResults"];
memcpy(&lastResults, data.bytes, data.length);
atau
NSData *data = [prefs objectForKey:@"lastResults"];
lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];
Setelah mengikuti saran di bawah ini, saya juga telah menerapkan NSCoder di objek saya (abaikan penggunaan NSString yang berlebihan untuk sementara):
#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"];
}
sumber
andSync
Anda menambahkan kode di atas? Itu bukan tanda tangan metode sebenarnya untuk NSUserDefaults. Juga,synchronize
tidak berguna seperti dulu: twitter.com/Catfish_Man/status/647274106056904704Saya pikir Anda mendapatkan kesalahan dalam metode initWithCoder Anda, setidaknya dalam kode yang diberikan Anda tidak mengembalikan objek 'self'.
saya menggunakan
dan
dan itu bekerja sempurna untuk saya.
Hormat kami,
Stefan
sumber
Saya pikir sepertinya masalah dengan kode Anda tidak menyimpan larik hasil. Ini memuat data coba gunakan
Ini akan mengembalikan larik yang ditentukan oleh kunci.
sumber
Lihat "Mengapa NSUserDefaults gagal menyimpan NSMutableDictionary di iPhone SDK?" ( Mengapa NSUserDefaults gagal menyimpan NSMutableDictionary di iPhone SDK? )
Jika Anda ingin (de) membuat serial objek kustom, Anda harus menyediakan fungsi untuk (de) membuat serial data (protokol NSCoding). Solusi yang Anda rujuk berfungsi dengan larik int karena larik tersebut bukan sebuah objek, melainkan potongan memori yang berdekatan.
sumber
Saya akan merekomendasikan untuk mencoba menyimpan barang-barang seperti ini di default db.
SQLite cukup mudah untuk diambil dan digunakan. Saya memiliki episode di salah satu screencasts saya ( http://pragprog.com/screencasts/v-bdiphone ) tentang pembungkus sederhana yang saya tulis (Anda bisa mendapatkan kode tanpa membeli SC).
Jauh lebih bersih untuk menyimpan data aplikasi di ruang aplikasi.
Semua yang dikatakan jika masih masuk akal untuk memasukkan data ini ke db default, kemudian lihat posting f3lix yang diposting.
sumber