У меня проблема с основными данными, у меня была таблица, которая в точности выглядит следующим образом
Пользователь (отношения с) 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, пропадает.