Вставить NSDictionary в CoreData

У меня есть NSDictionary и база данных CoreData. Я хочу вставить NSDictionary в базу данных.

  • Как это сделать (возможно, фрагменты кода)?

  • Каков подходящий тип для атрибута словаря?

Ответы

Ответ 1

Вам потребуется сериализовать NSDictionary в NSData, CoreData может содержать NSData.
Но вы не сможете искать (предикат) элемент вашего NSDictionary.

И если мы подумаем об этом, NSDictionary - это набор данных.
Таблица в базе данных представляет собой набор данных.
В CoreData самым близким, что вы получили к набору данных, является NSManagedObject.

Итак, моим советом было бы сделать подкласс NSManagedObject, который будет содержать информацию, содержащуюся в вашем NSDictionary. key будет атрибутом, а значением будет value этого атрибута. И вы сможете искать на основе атрибута этого подкласса NSManagedObject.

Ответ 2

Я нашел другой способ добавить словарь в Coredata, создав атрибут с типом данных "Transformable".

Например, создайте объект в своем проекте и атрибут с типом данных Transformable. Создайте подкласс для NSManagedObject. Атрибут будет доступен с типом данных 'id', сменой в NSDictionary.

Ниже я сделал (имя подкласса My NSManagedObject - "DictTest" )

-(void)InsertIntoDataBase
{
    DictTest *entityDict=(DictTest*)[NSEntityDescription insertNewObjectForEntityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
    NSMutableDictionary *mutDict=[NSMutableDictionary dictionary];
    [mutDict setValue:@"1" forKey:@"1"];
    [mutDict setValue:@"2" forKey:@"2"];
    [mutDict setValue:@"3" forKey:@"3"];
    [mutDict setValue:@"4" forKey:@"4"];
    [mutDict setValue:@"5" forKey:@"5"];
    [mutDict setValue:@"6" forKey:@"6"];
    [mutDict setValue:@"7" forKey:@"7"];
    [mutDict setValue:@"8" forKey:@"8"];
    [mutDict setValue:@"9" forKey:@"9"];
    [mutDict setValue:@"10" forKey:@"10"];
    [entityDict setInfoDict:mutDict];
    NSError *error;
    if(![self.managedObjectContext save:&error])
    {
        NSLog(@"error description is : %@",error.localizedDescription);
    }
    else{
        NSLog(@"Saved");

    }
}

для записи записей

-(void)FetchRecord
{
    NSFetchRequest *request=[[NSFetchRequest alloc]init];
    NSEntityDescription *entity=[NSEntityDescription entityForName:@"DictTest" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];
     NSArray *fetchArray=  [self.managedObjectContext executeFetchRequest:request error:nil];
    for (DictTest *obj in fetchArray) {
        NSLog(@"Dict is : %@",obj.infoDict);
    }
}

Ответ 3

Настройте описание сущности, вставьте новый объект, а затем используйте:

[managedObject setValuesForKeysWithDictionary:dict];

Ответ 4

Почему бы вам просто не создать сущность со всеми данными из вашего NSDictionary, а затем просто проанализировать ее.

Проверьте это для некоторых фрагментов кода CoreData. Вы можете просто создать несколько объектов для хранения информации о ваших словарях. Затем вы можете проанализировать свой словарь и сохранить соответствующие атрибуты:

 NSManagedObject *photoObject = [NSEntityDescription insertNewObjectForEntityForName:@"Photo"
                                                              inManagedObjectContext:context];    
 [photoObject setPhotographer:[myDictionary objectForKey:@"photographer"]];
 and so on...

Независимо от того, насколько сложна структура данных XML, если вы можете создать хорошую структуру сущности, довольно просто просто заглушить ее все в CoreData. У вас также будет намного удобнее время с запросами, если вы потратите время на создание объектов вместо того, чтобы просто сбрасывать весь словарь в одном поле.