NSUserDefaults在检索之前刷新数据

时间:2012-01-17 08:29:18

标签: iphone objective-c ios ipad

我使用NSUserDefaults将NSMutableArray和NSMutableDictionery保存为

NSUserDefaults *nsdefaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableDictionary *appDetail = [[NSMutableDictionary alloc]initWithDictionary:[sbjasonObj objectWithString:result]];

    if ([appDetail objectForKey:KStores]) {
        NSArray *stores = [appDetail objectForKey:KStores];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
    }

    NSString *colorString = [appDetail objectForKey:KColorTheme];

    [nsdefaults setObject:colorString forKey:KColorTheme];

    NSString *lookBookURL = [appDetail objectForKey:kLookBook];
    NSLog(@"look_book%@",lookBookURL);

    [nsdefaults setObject:lookBookURL forKey:kLookBook];

    [nsdefaults setObject:appDetail forKey:kGetAppDetail];//using same key to save in sandbox
    [nsdefaults synchronize];
    [appDetail release];

并将此数据检索为

shopsLocations = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults]
                                                     objectForKey:KStores]];
    NSLog(@"shopsLocations: %@",shopsLocations);

它给了我“商店位置:( )“表示0值。当我尝试检索”appDetail“时,它也会给出零键和值。

我的问题是 1.我可以在NSUserDefaults中保存数组和字典吗? 2.当刷新NSUserDefaults中的数据时? 3.如何从NSUserDefaults中检索数据?

提前致谢。

4 个答案:

答案 0 :(得分:4)

stores数组的内容是什么?

如果要保存到NSUserDefaults(使用setObject:forKey:),则唯一允许的内容是可以转换为属性列表的对象。这些对象是NSArrayNSDictionaryNSStringNSDataNSDateNSNumber(int,float,bool)。

如果要将其他内容保存到NSUserDefaults,则必须先创建NSData对象。您可以在NSKeyedArchiver的帮助下完成此操作。

答案 1 :(得分:0)

是的。您可以在NSUserDefaults中保存数组和字典。

arrayForKeydictionaryForKey是吸气剂。使用setObject设置数组。

要在NSUserDefaults使用中不刷新数据,

[nsdefaults setObject:colorString forKey:KColorTheme];
[nsdefaults synchronize];

已更新:

要检索,

shopsLocations = [[NSArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:KColorTheme]];

答案 2 :(得分:0)

尝试替换

if ([appDetail objectForKey:KStores]) {
        NSArray *stores = [appDetail objectForKey:KStores];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
    }

if ([appDetail objectForKey:KStores]) {
        NSArray *stores=[[NSArray alloc] initWithArray:[appDetail objectForKey:KStores]];
        NSLog(@"%@",stores);
        [nsdefaults setObject:stores forKey:KStores];
        [stores release];
    }

让我知道它是否有效。

答案 3 :(得分:0)

您无法直接在NSUserDefaults中存储数组。而是将您的数组存档到NSData之类的结构,然后将其存储在NSUserDefaults中。

E.g。

if ([appDetail objectForKey:KStores]) {
    NSArray *stores = [appDetail objectForKey:KStores];
    NSLog(@"%@",stores);
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stores];
    [nsdefaults setObject:data forKey:KStores];
}

要检索数组,请执行相反的操作。即检索NSData,然后将其解压缩到数组

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:KStores];
shopsLocations = [NSKeyedUnarchiver unarchiveObjectWithData:data];