2010-06-29 84 views
2

我正在写NSUserDefaults的使用作为数据存储机制的应用程序,和我打一个问题,试图挽救数据(即符合属性列表协议)时:将NSUserDefaults的不保存的NSDictionary

+ (BOOL)storeAlbum:(Album *)album 
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *albums = (NSMutableDictionary *)[prefs objectForKey:@"my_adventure_book_albums"]; 
    NSLog(@"Existing albums: %@",albums); 
    if (!albums) 
     albums = [NSMutableDictionary dictionaryWithObject:album forKey:@"album"]; 
    else 
     [albums setObject:album forKey:@"album"]; 
    NSLog(@"%@",album); 
    [prefs setObject:albums forKey:@"my_adventure_book_albums"]; 
    return [prefs synchronize]; 
} 

我得到这样的输出:

2010-06-29 17:17:09.929 MyAdventureBook[39892:207] Existing albums: (null) 
2010-06-29 17:17:09.930 MyAdventureBook[39892:207] test 
2010-06-29 17:17:09.931 MyAdventureBook[39892:207] *** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '{ 
    album = test; 
}' of class 'NSCFDictionary'. 

专辑的说明方法是这样的:

- (NSString *)description 
{ 
    // Convert to a NSDictionary for serializing 
    if (!title) title = @""; 
    if (!date) date = [NSDate dateWithTimeIntervalSinceNow:0]; 
    if (!coverImage) coverImage = @""; 
    if (!images) images = [[NSArray alloc] initWithObjects:@"",nil]; 

    //NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:title,date,coverImage,images,nil] forKeys:[NSArray arrayWithObjects:@"title",@"date",@"coverImage",@"images",nil]]; 
    //NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:title,nil] forKeys:[NSArray arrayWithObjects:@"title",nil]]; 
    //return [dict description]; 
    return @"test"; 
} 

一所有注释掉的行都会有相同的结果,所以我只是决定看看NSString“测试”是否会起作用,它当然不会。

回答

8

但是,您放入字典中的对象,Album*很可能不是属性列表对象,是吗?每个对象,一直向下,都需要成为一个属性列表对象,以便它能够工作。 A description方法不足以实现此目的。

作为一种解决方法,您可以使用NSCodingNSKeyedArchiver将您的字典写出到NSData,您可以将其存储在首选项中。

4

NSUserDefaults总是返回不可变的对象,所以你不能将它们强制转换为可变的。做[prefs objectForKey:@"my_adventure_book_albums"] mutableCopy](并记住完成后释放它)。

+0

不,结果相同: *** - [NSUserDefaults setObject:forKey:]:尝试插入非属性值'{ album = test;类'NSCFDictionary'的' }'。 – 2010-06-29 21:26:47

5

只能将基础基础类型放入属性列表中。 NSUserDefaults将首选项写为属性列表。请参阅property list允许的类型。简而言之,它是数字,字符串,数据,日期以及这些数组和字典。字典必须有字符串键。