Вставить 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. У вас также будет намного удобнее время с запросами, если вы потратите время на создание объектов вместо того, чтобы просто сбрасывать весь словарь в одном поле.