我正在尝试在NSUserDefaults
保存对象,在此网站上遇到很多问题但无法解决问题,我的NSObject
有另一个对象NSMutableArray
。像这里主要对象是HotelDC
,它有一个数组“features”一组FeactureDC
个对象。
这是我的代码:
- (id)initWithCoder:(NSCoder *)decoder {
self = [[HotelDC alloc] init];
if (self != nil) {
self.hotel_id = [decoder decodeIntegerForKey:@"hotel_id"];
self.name = [decoder decodeObjectForKey:@"name"];
self.features = [decoder decodeObjectForKey:@"features"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeInt:hotel_id forKey:@"hotel_id"];
[encoder encodeObject:name forKey:@"name"];
[encoder encodeObject:features forKey:@"features"];//its a mutable array
}
我应该如何保存它并检索?我收到错误
Attempt to insert non-property value '<HotelDC: 0xa600fe0>' of class 'HotelDC'.
Note that dictionaries and arrays in property lists must also contain only property values.
解决方案:
//Setting
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:hotelObjSelected];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:myEncodedObject forKey:@"selectHotelObject"];
[[NSUserDefaults standardUserDefaults] synchronize];
// retrieving
NSData *data = [defaults objectForKey:@"selectHotelObject"];
hotelObjSelected = [NSKeyedUnarchiver unarchiveObjectWithData:data];
答案 0 :(得分:3)
NSUserDefaults
由属性列表支持。唉,proprety列表不能包含序列化对象。引自the manual:
默认对象必须是属性列表,即(或 对于集合的实例组合):NSData,NSString, NSNumber,NSDate,NSArray或NSDictionary。如果你想存储任何 在其他类型的对象中,通常应将其存档以创建 NSData的实例
您必须创建自己的序列化数据文件以直接保存对象,或将对象序列化为允许的类型之一。令人讨厌的是,NSUserDefaults
没有调用encodeWithCoder
- 它只是屏幕传递给setObject:forKey:
的对象类型。最好的办法是自己序列化HotelDC
的字段,或者将对象存档到NSData
实例并存储它。
答案 1 :(得分:1)
我通过以下方式做到了这一点。检查它。下面的代码是for循环。
NSMutableArray *newEventArray = [[NSMutableArray alloc] init];
[newEventArray addObject:title];
[newEventArray addObject:alarmDate];
NSArray *iCalAlarmArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"alarmList"];
if(iCalAlarmArray == nil || [iCalAlarmArray count] <= 0)
{
iCalAlarmArray = [[NSMutableArray alloc] init];
}
iCalAlarmArray = [iCalAlarmArray arrayByAddingObject:newEventArray];
[[NSUserDefaults standardUserDefaults] setObject:iCalAlarmArray forKey:@"alarmList"];
[[NSUserDefaults standardUserDefaults] synchronize];
这可以帮助你。
答案 2 :(得分:0)
您应该在FeatureDC中编写类似的编码和解码方法,并将其存储在数组中,然后在此处进行编码。
答案 3 :(得分:0)
默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。如果要存储任何其他类型的对象,通常应将其存档以创建NSData的实例