7

我正在尝试将对象保存在 中NSUserDefaults,在此站点上遇到了许多问题,但无法解决问题,我NSObjectNSMutableArray另一个对象。就像这里的主要对象是HotelDC,它有一个数组“特征”一个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];
4

4 回答 4

3

NSUserDefaults由属性列表支持。唉,属性列表不能包含序列化对象。引用手册

默认对象必须是一个属性列表,即以下实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例

您必须创建自己的序列化数据文件以直接保存对象,或将对象序列化为允许的类型之一。烦人的是,NSUserDefaults不调用encodeWithCoder- 它只是筛选传递给setObject:forKey:. 最好的办法是序列化HotelDC你自己的字段,或者将对象归档到一个NSData实例并存储它。

于 2013-02-04T12:40:40.830 回答
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];

愿这对你有所帮助。

于 2013-02-04T13:06:46.500 回答
0

您应该在FeatureDC中编写类似的编码和解码方法并将其存储在一个数组中,然后在此处进行编码。

于 2013-02-04T12:38:32.993 回答
0

默认对象必须是一个属性列表,即以下实例(或集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。如果要存储任何其他类型的对象,通常应该将其归档以创建 NSData 的实例

于 2016-05-03T12:53:37.500 回答