NSUserDefaults не будет сохранять NSDictionary - PullRequest
2 голосов
/ 30 июня 2010

Я пишу приложение, которое использует NSUserDefaults в качестве механизма хранения данных, и у меня возникает проблема при попытке сохранить данные (что соответствует протоколам списка свойств):

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

Я получаю этоoutput:

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 "«Тест» будет работать, что, конечно, не работает.

Ответы [ 3 ]

8 голосов
/ 30 июня 2010

Но объект, который вы помещаете в словарь, Album*, скорее всего, не является объектом списка свойств, не так ли? Каждый объект, вплоть до конца, должен быть объектом списка свойств, чтобы это работало. description метод недостаточно хорош, чтобы это произошло.

В качестве обходного пути вы можете использовать NSCoding и NSKeyedArchiver, чтобы записать свой словарь в NSData, который вы можете сохранить среди предпочтений.

5 голосов
/ 30 июня 2010

Вы можете помещать только основные типы фундаментов в список свойств.NSUserDefaults записывает предпочтения в виде списка свойств.Смотрите здесь список свойств разрешенных типов.Короче говоря, это числа, строки, данные, даты, а также массивы и словари из них.Словари должны иметь строковые ключи.

4 голосов
/ 30 июня 2010

NSUserDefaults всегда возвращает неизменяемые объекты, поэтому вы не можете просто привести их к изменяемым. Сделайте [prefs objectForKey:@"my_adventure_book_albums"] mutableCopy] (и не забудьте отпустить его, когда закончите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...