2012-01-17 3 views
2

Я использую NSUserDefaults для сохранения NSMutableArray и NSMutableDictionery вNSUserDefaults промывает данные, прежде чем я получить

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); 

Это дает мне "shopsLocations: ( )" означает 0 стоимость. Также, когда я пытаюсь восстановить «appDetail», он также дает нулевые ключи и значения.

Мой вопрос: 1. Могу ли я сохранить массив и словарь в NSUserDefaults? 2. Когда данные в NSUserDefaults вымываются? 3. Как получить данные из NSUserDefaults?

Заранее спасибо.

+0

попробуйте удалить appdetail и изменить его nsdefaults – NoobMe

+0

где я должен удалить appdetail ?? – fibnochi

+0

Я получаю магазины через nslog перед настройкой, но не могу получить. – fibnochi

ответ

4

Что представляет собой содержимое вашего массива stores?

Если вы хотите сохранить NSUserDefaults (с setObject:forKey:), единственным разрешенным контентом являются объекты, которые можно преобразовать в список свойств. Эти объекты: NSArray, NSDictionary, NSString, NSData, и NSNumber (int, float, bool).

Если вы хотите сохранить что-то еще в NSUserDefaults, вам необходимо сначала создать объект NSData. Вы можете сделать это с помощью NSKeyedArchiver.

+0

да это сработало.кол – fibnochi

0

Да. Вы можете сохранить массив и словарь в NSUserDefaults.

arrayForKey и dictionaryForKey являются геттерами. Используйте setObject для установки массива.

Чтобы не сбрасывают свои данные в NSUserDefaults использовать,

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

Обновлено:

Чтобы получить,

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

Я делаю то же, что и ты сказал. Смотрите и читайте вопрос еще раз. – fibnochi

+0

Чтобы получить массив, хранящийся в NSUserDefaults, вы используете '[NSUserDefaults standardUserDefaults] objectForKey: KStores]' вместо этого используйте '[[NSUserDefaults standardUserDefaults] arrayForKey: KStores]' – Heena

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]; 
    } 

и дайте мне знать, если это сработает.

+0

ОК, супер круто .. будет ли обновленный код работать ..? Просто отредактирован. –

+0

исправлены ошибки. Я удалю мои предыдущие комментарии. –

+0

Итак, мой предыдущий код был в порядке? –

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]; 
Смежные вопросы