我遇到了核心数据的问题,我有一张看起来像这样的表
用户(与之关系)Rack(与之关系)RackItem
如何使用User和现有Rack对象中的现有项目对象将新对象插入rackItem
我尝试获取现有对象
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;
}
结果很好,数据插入成功。但是现有的对象被修改了。 我认为这是问题所在 id object = [result 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;
插入后
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变量行都不见了。
答案 0 :(得分:0)
这看起来有点令人困惑...... 首先你应该有,因为NeverBe说了Rack和RackItem之间的多对多关系
然后在我看来,你在这里有一个概念问题。 如果你想插入一个与同一个Rack相关的新对象而不是之前的RackItem ...只需获取Rack Object并插入你的新RackItem,方法是将它的机架属性设置为你刚刚获取的Rack。
你真的应该保持简单,否则你会遇到很多Coredata的不稳定问题 希望这会有所帮助