Основные данные вставляют новые данные с существующими отношениями - PullRequest
0 голосов
/ 15 февраля 2012

У меня проблема с основными данными, у меня была таблица, которая в точности выглядит следующим образом

Пользователь (отношения с) Rack (отношения с) RackItem

Как вставить новый объект в rackItemс существующим объектом item в User и существующим объектом Rack

Я пытаюсь извлечь существующий объект

predicate = 
        [NSPredicate predicateWithFormat:@"userID = %@ AND rack.rackID = %@", 
                                        _userID, 
                                        @"1"];
entityName = @"RackItem";
NSArray *result = [self fetchDataWithEntity:entityName predicate:predicate];
id object = [result last object];

, затем в части setRackItem создаю новую EntityDescription и сохраняю ее в базовые данные, используя эту функцию

- (id)objectInManagedObjectContextForDictionary:(NSDictionary *)dictionary 
                                     entity:(NSString *)entityName 
                              managedObject:(id)object 
                                   insertKey:(NSArray *)keys 
                                   relation:(BOOL)isRelation {
// Recursive method
for (id key in dictionary) {
    id value = [dictionary objectForKey:key];
    NSString *camelCase = [key stringByReplacingCharactersInRange:NSMakeRange(0,1) 
                                                       withString:[[key substringToIndex:1] uppercaseString]];
    if ([value isKindOfClass:[NSDictionary class]] && isRelation) {   
        if ([keys containsObject:camelCase] && keys != nil) {
            id newObject = 
                [NSEntityDescription insertNewObjectForEntityForName:camelCase 
                                              inManagedObjectContext:_managedObjectContext];
                value = [self objectInManagedObjectContextForDictionary:[dictionary objectForKey:key] 
                                                                 entity:camelCase 
                                                          managedObject:newObject
                                                              insertKey:keys 
                                                               relation:isRelation];
        } else {
            SEL selector = NSSelectorFromString(key);
            id newObject = [object performSelector:selector];
            value = [self objectInManagedObjectContextForDictionary:[dictionary objectForKey:key] 
                                                             entity:camelCase 
                                                      managedObject:newObject
                                                          insertKey:keys 
                                                           relation:isRelation];
        }
    }
    NSString *methodName = [NSString stringWithFormat:@"set%@:", camelCase];
    SEL selector = NSSelectorFromString(methodName);
    [object performSelector:selector withObject:value];
}
return object;
}

И результат хороший, данные вставлены успешно.Но существующий объект был изменен.Я думаю, что это проблема идентификатора объекта = [результат lastObject];нужно сохранить.Кто-нибудь может мне помочь?

Некоторое обновление Результат после последующей вставки

Перед вставкой

 1|9|2|0|0||||248|52|||1|||||||
 2|9|2|0|0|||||||||||||||
 3|9|2|0|0|||||||||||||||
 4|9|2|0|0|||||||||||||||
 5|9|1|0|0|1||||||||||||||
 sqlite> select *from zrackitem;

После Insert

 1|9|2|0|0||||248|52|||1|||||||
 2|9|2|0|0|||||||||||||||
 3|9|2|0|0|||||||||||||||
 4|9|2|0|0|||||||||||||||
 5|9|2|0|0|||||||||||||||
 6|9|1|0|0|1||||||||||||||
 sqlite> select *from zrackitem; 

он показывает, что каждый раз, когда я вставляю существующую строку переменной zrack, пропадает.

1 Ответ

0 голосов
/ 15 февраля 2012

Это немного сбивает с толку ... Во-первых, вы, конечно, должны были, как сказал NeverBe, отношения между множеством между Rack и RackItem

Тогда мне кажется, что у вас здесь есть концептуальная проблема. Если вы хотите вставить новый объект, связанный с тем же Rack, чем предыдущий RackItem ... просто извлеките этот Rack Object и вставьте новый RackItem, установив его свойство rack в только что выбранный Rack.

Вы действительно должны быть простыми, иначе у вас будет много проблем непостоянства Coredata. Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...