CoreData — как правильно сохранить данные?

Доброе время суток, возникла проблема при сохранении данных, из начально:

Есть JSON: (Данные про пользователя - название сущности "Client")
{
    "area_residence" = "\U041a\U0438\U0435\U0432";
    "b_day" = "1991-12-29";
    comment = "";
    email = "alex@gmail.com";
    gender = 1;
    id = 4142;
    "last_visit" = "2014-06-11 15:30:21";
    marital = 0;
    name = "\U0410\U043b\U0435\U043a\U0441\U0430\U043d\U0434\U0440";
}


Сохраняю данные:

for (NSDictionary *dictionary in data) {
        NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:managedObjectContext];

        for (NSString *key in [dictionary allKeys]) {
            if ([managedObject respondsToSelector:NSSelectorFromString(key)]) {
                if (![[dictionary valueForKey:key] isEqual:[NSNull null]]) {
                    [managedObject setValue:[dictionary objectForKey:key] forKey:key];
                }
            }
        }

        [managedObjectContext insertObject:managedObject];
    }

    [managedObjectContext save:&error];


Сохранение проходит успешно, но, задача не много поменялась, и теперь нужно хранить в сущности Client и национальность пользователя, которая имеет вид:

nationality =     {
        id = 216;
        ar = Ukraine;
        de = Ukraine;
         en = Ukraine;
         fr = Ukraine;
         ru = "\U0423\U043a\U0440\U0430\U0438\U043d\U0430";
         ua = "\U0423\U043a\U0440\U0430\U0438\U043d\U0430";
    };


JSON в полном объеме:
{
    "area_residence" = "\U041a\U0438\U0435\U0432";
    "b_day" = "1991-12-29";
    comment = "";
    email = "alex@gmail.com";
    gender = 1;
    id = 4142;
    "last_visit" = "2014-06-11 15:30:21";
    marital = 0;
    name = "\U0410\U043b\U0435\U043a\U0441\U0430\U043d\U0434\U0440";
    nationality =     {
        id = 216;
        ar = Ukraine;
        de = Ukraine;
         en = Ukraine;
         fr = Ukraine;
         ru = "\U0423\U043a\U0440\U0430\U0438\U043d\U0430";
         ua = "\U0423\U043a\U0440\U0430\U0438\U043d\U0430";
        };
    }


И так сущность "Client":
3359d7774da2460bb3b17a44d499e3fb.png

Cущность "Nationality":
7ea89967b80f4aa6aec3d45c8c6cbae8.png

Общий скрин:
11a27abbd2504224a273654baf2beb3f.png

При повторном запуске получаю ошибку:

2014-06-15 15:26:50.092 CoreDataEntity[3444:60b] -[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x8d77720
2014-06-15 15:26:50.094 CoreDataEntity[3444:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x8d77720'


По всей видимости в "NSManagedObject" не удается записать объект:

[managedObject setValue:[dictionary objectForKey:key] forKey:key];


Как же тогда можно поступить, что бы быстро и бесболезненно можно было записывать данные? Заранее спасибо за помощь!
  • Вопрос задан
  • 2854 просмотра
Пригласить эксперта
Ответы на вопрос 3
morozovdenis
@morozovdenis
ну вы же set-аете dictionary в relationship. ставьте условие не проверку что это relationship, пишите второй цикл и set-айте значения полей
Ответ написан
@CT4H
- (void)parseData:(NSArray*)data
{
    for (NSDictionary *clientDictionary in data) {
        
        NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:managedObjectContext];
        //Вытаскиваете нужное нужное значение, добавляете его в объект
        ...
        [managedObject setValue:simpleValue forKey:key];

        NSDictionary* dictNational = [clientDictionary  objectForKey:@"nationality"];
        NSManagedObject *natObject = [NSEntityDescription insertNewObjectForEntityForName:@"nationality" inManagedObjectContext:managedObjectContext];
        //Аналогично парсите dictNational в natObject
       ...
       [natObject setValue:simpleValue forKey:key];

       [managedObject setValue: natObject forKey:@"nationality"];
    }
    [managedObjectContext save:&error];
}
Ответ написан
@mr_cloud
iOS Developer
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы