更新核心数据实体obj

时间:2014-09-10 16:07:54

标签: objective-c core-data

我有一个复杂的CoreData实体:MY_ENTITY

我从我的webService收到一个MY_ENTITY类型的对象。

在某些情况下,我需要使用收到的obj编辑我的本地CoreData obj(MY_ENTITY)。

所以:

我在CoreData中有OBJ_1

我从WebService收到OBJ_2。

我需要从OBJ_2更新OBJ_1。 我是否要设置所有字段,还是可以将OBJ_1 ObjectID分配给OBJ_2并保存上下文(相同的上下文)?

2 个答案:

答案 0 :(得分:0)

由于它们是两个独立的实例,因此您需要将所需的内容从O2移动到O1。您可以使用诸如此类的例程来执行属性的move属性,假设两个对象属于同一个Entity类:

// use entity description to get entity attributes and use as keys to get value

// scan attributes
NSDictionary *attributes = [[sourceEntity entity] attributesByName];
for (NSString *attribute in attributes) {
    id value = [sourceEntity objectForKey:attribute];
    if (value == nil) {
        continue;
    }

   NSAttributeType attributeType = [[attributes objectForKey:attribute] attributeType];

   switch (attributeType) {
       case NSStringAttributeType:
           // value = [value stringValue];
           break;
       case NSInteger16AttributeType:
       case NSInteger32AttributeType:
       case NSInteger64AttributeType:
       case NSBooleanAttributeType:
           value = [NSNumber numberWithInteger:[value  integerValue]];
           break;
       case NSFloatAttributeType:
       case NSDecimalAttributeType:
           value = [NSNumber numberWithDouble:[value doubleValue]];
           break;
       case NSDateAttributeType:
           if (dateFormatter != nil)
               value = [dateFormatter stringFromDate:value];
           break;
       default:
           value = @"";
           break;
   }
   [targetEntity setValue:value forKey:attribute];
}

请注意,这只是一个示例,如果您打算使用,则需要清理并添加错误处理。此外,如果您通过Web服务获取O2作为JSON或XML,那么您可以使用它来简单地将JSON有效负载推送到targetEntity。这假设您的有效负载attrs与您的实体attrs对齐。在这种情况下,您将使用块或等效项替换sourceEntity和JSON有效内容,例如:

   NSArray *seedData = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
                                                        options:kNilOptions
                                                          error:&err];

   [seedData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

...
   id value = [obj objectForKey:attribute];
...
}

答案 1 :(得分:0)

您从Web服务接收OBJ_2的格式是什么?

无论哪种方式,将OBJ_2分配给OBJ_1都不会起作用,因为您只会替​​换本地变量所指向的引用。

要同步您需要的服务器数据的本地CoreData实体,以修改现有权利的属性。根据您的数据模型和您接收OBJ_2的格式,有不同的方法来实现这一目标。