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のインスタンスを作成する必要があります

オブジェクトを直接保存するために独自のシリアル化されたデータファイルを作成するか、許可されたタイプの1つとしてオブジェクトをシリアル化する必要があります。迷惑なことに、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 に答える