Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据插入具有现有关系的新数据_Iphone_Ios_Core Data - Fatal编程技术网

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

Iphone 核心数据插入具有现有关系的新数据,iphone,ios,core-data,Iphone,Ios,Core Data,我的核心数据有问题,我有一个表,完全像这样 用户(与)机架(与)机架项目的关系 我应该如何将新对象插入到rackItem,并在用户和现有Rack对象中使用现有的item对象 我尝试获取现有对象 predicate = [NSPredicate predicateWithFormat:@"userID = %@ AND rack.rackID = %@", _userID,

我的核心数据有问题,我有一个表,完全像这样

用户(与)机架(与)机架项目的关系

我应该如何将新对象插入到rackItem,并在用户和现有Rack对象中使用现有的item对象

我尝试获取现有对象

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对象=[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; 
插入后的

 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变量的现有行时,它都会消失。

这似乎有点让人困惑。。。 首先,正如NeverBe所说的,你们当然应该有一个Rack和RackItem之间的多对多关系

在我看来,这里有一个概念上的问题。 如果要插入与前一个RackItem相关的同一机架的新对象。。。只需将Rack对象的Rack属性设置为刚获取的Rack,即可获取该Rack对象并插入新的RackItem

你真的应该保持简单,否则你会有很多Coredata易变性问题
希望这会有所帮助

在这种情况下,您应该使用多对多关系。您复制对象的目的是什么?@NeverBe我已经按照您的方式进行了操作,但是第一次插入似乎是正确的,但是如果我第二次插入,现有的可变机架行将消失