вставить NSDictionary в CoreData - PullRequest
       4

вставить NSDictionary в CoreData

15 голосов
/ 30 декабря 2011

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

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

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

Ответы [ 4 ]

27 голосов
/ 30 декабря 2011

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

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

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

8 голосов
/ 17 сентября 2014

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

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

Ниже описано, что я сделал (имя моего подкласса 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);
    }
}
5 голосов
/ 06 августа 2013

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

[managedObject setValuesForKeysWithDictionary:dict];
4 голосов
/ 31 декабря 2011

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

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

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

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

...