Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Есть несколько способов приблизиться к этому:

а. Создайте сущность, которая является представителем 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

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

Ответ 3

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

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

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

Ответ 4

У меня есть решение для решения этой проблемы просто сохраните dictionaryObj.description в String в 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;
}