核心数据插入具有现有关系的新数据

时间:2012-02-15 12:22:44

标签: iphone ios core-data

我遇到了核心数据的问题,我有一张看起来像这样的表

用户(与之关系)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变量行都不见了。

1 个答案:

答案 0 :(得分:0)

这看起来有点令人困惑...... 首先你应该有,因为NeverBe说了Rack和RackItem之间的多对多关系

然后在我看来,你在这里有一个概念问题。 如果你想插入一个与同一个Rack相关的新对象而不是之前的RackItem ...只需获取Rack Object并插入你的新RackItem,方法是将它的机架属性设置为你刚刚获取的Rack。

你真的应该保持简单,否则你会遇到很多Coredata的不稳定问题 希望这会有所帮助