NSDictionary и основные данные

Пожалуйста, я пытаюсь получить некоторые знания в основных данных. До сих пор я привык к созданию сущностей и добавлению, извлечению и удалению значений из этой сущности.

Мой вопрос заключается в следующем. Каковы возможные способы хранения NSDictionary свойства в сущности при использовании основных данных?

4 ответа

Вы должны использовать "Transformable Attributes":

  1. открыть *.xcdatamodeld файл
  2. выберите объект
  3. добавьте атрибут (назовите его, например, "info") и установите тип "Transformable"
  4. генерировать соответствующие NSManagedObject файлы подкласса (Файл-> Новый-> Файл... NSManagedObject подкласс)
  5. открыть *.h файл и тип изменения для свойства "info" с id на NSMutableDictionary*

все остальное работает автоматически

Для получения дополнительной информации см.: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdNSAttributes.html.

Есть несколько способов подойти к этому:

а. Создайте объект, представляющий NSDictionary, чтобы каждый ключ словаря был представлен атрибутом объекта.

б. Если вам не нравится описанный выше подход, когда вы создаете отдельную сущность, вы все равно можете сохранить NSDictionary в одном поле Core Data типа NSData, при условии, что вы сначала сериализовали NSDictionary в NSData.

//NSDictionary to NSData
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:dictionary forKey:@"Some Key Value"];
[archiver finishEncoding];
//  data is now ready to use

Затем вам также необходимо преобразовать NSData обратно в NSDictionary при чтении его из Core Data.

// NSData to NSDictionary
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSDictionary *dictionary = [[unarchiver decodeObjectForKey:@"Some Key Value"] retain];
[unarchiver finishDecoding];
//  dictionary is now ready to use

с. Наконец, вы можете использовать постоянную среду, такую ​​как Sensible TableView, где все ваши структуры данных автоматически выбираются, отображаются и сохраняются. Спасает меня тонну кода сам.

Измените тип атрибута на Transformable,

Если вы используете mogenerator (вы очень хорошо должны это сделать), тип по умолчанию, сгенерированный для трансформируемого: id,

Чтобы генератор мог генерировать определенный тип NSDictionaryВы можете добавить пользовательский ключ attributeValueClassName со значением NSDictionary для атрибута. Обратитесь к этому скриншоту.

У меня есть решение для этого просто сохранить dictionaryObj.description в строке в Core Data и при извлечении строки словаря вы можете преобразовать в словарь

-(NSMutableDictionary *)getMetaDataDictionary:(NSString *)string
{
    NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSPropertyListFormat format;
    NSMutableDictionary * metaDataDictionary;
    @try
    {
        NSError * error;
        metaDataDictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable
                                                                                     format:&format
                                                                                      error:&error];
        if(!metaDataDictionary)
        {
            NSLog(@"ERROR: COULD NOT PARSE META-DATA : %@", error.description);
        }
    }
    @catch(NSException * exp)
    {
         NSLog(@"DICTIONARY :: %@", exp.description);
    }

    return metaDataDictionary;
}
Другие вопросы по тегам