【问题标题】:Setting core data relationship reusing same object removes previous relation重用同一对象设置核心数据关系会删除以前的关系
【发布时间】:2011-09-21 13:45:11
【问题描述】:

我正在从 Web 服务导入数据,在这些数据中我有一个类别树。

例如:

   餐厅
- 意大利语
- 墨西哥
- 牛排馆

在我的模型中,我设置了一个名为 ParentCategory 的关系和一个名为 Subcategories 的逆关系。到目前为止一切都很好。

现在,当我导入我的类别时,我正在做这样的事情:(注意:我的代码看起来不像这样。我已经更改了它以举例说明我的问题)

NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"Categories" inManagedObjectContext:context];

NSDescription *parentCategory = [NSEntityDescription insertNewObjectForEntityForName:[categoryEntity name] inManagedObjectContext:context]

//Then I actually set some values for parentCategory.
//Then create the subcategories. 

NSDescription *italianDescription = [NSEntityDescription insertNewObjectForEntityForName:[categoryEntity name] inManagedObjectContext:context];
[italianDescription objectForKey:@"Italian" forKey:@"name"];

//Set the relationship
[italianDescription objectForKey:parentCategory forKey:@"ParentCategory"];

//All this works great but then when 
NSEntityDescription *mexicanDescription = [NSEntityDescription insertNewObjectForEntityForName:[categoryEntity name] inManagedObjectContext:context];
[mexicanDescription objectForKey:@"Mexican" forKey:@"name"];
[mexicanDescription objectForKey:parentCategory forKey:@"ParentCategory"];

似乎当最后一行代码运行时,它从“italianDescription”中删除了关系,因此在我保存我的上下文后,它显示它没有父类别。我从我的 Web 服务中删除了一些数据,并且只有我设置与父类别对象 X 的关系的最后一个子类别保留了它。以前的所有内容都会丢失它。

我查看了苹果开发者文档,但并没有什么帮助。话虽如此,我该如何克服呢?或者用关系导入它的有效方法是什么。

【问题讨论】:

  • 请在您的问题中添加 - 您的 Category 实体的定义,以及您的实际代码。

标签: objective-c ios core-data core-data-migration


【解决方案1】:

我不认为你在设置任何东西,为 NSManagedObjects 设置值的方法是

setValue: forKey:

您应该使用 NSManagedObject* 而不是 NSDescription*

您可能需要考虑对实体进行子类化,因为这样可以更轻松地访问和设置属性。在这种情况下会是

MyCustomEntity* myobj=[NSEntityDescription insertNewObjectForEntityForName:@"MyentityName" inManagedObjectContext:context];

然后您可以通过使用带有点符号或消息传递的属性来设置值。您可以通过在核心数据编辑器中选择实体来执行此操作,然后在菜单栏上的编辑器下有一个创建 NSManagedObject 子类的选项,创建后您需要告诉实体它现在有一个自定义类。这是在实体下的右侧实用工具栏中完成的,有一个类字段,只需输入新类的名称即可进行设置。

【讨论】:

  • 我正在设置关系。运行后,我的导入信息进入数据库,并且只有最后一个父类别关系存在。据我所知, NSEntityDescription 将为我创建托管对象。检查developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…中的第一块代码
  • @Ares,您的父类别是一对多关系吗?如果它是一对一的,那么在最后设置它会替换它的当前值。
  • 是一对一的,一个类只能有一个父类。逆(子类别)是一对多的,因为一个类别可以有许多子类别。实际上,我只是检查了一下,逆向设置为一对一。 :) 做到了。谢谢你。有趣的是,有时我们会忽略一些简单的小事。
  • @Ares,是的,没问题,在处理核心数据时,那些小箭头似乎总是问题的根源。最好的
  • 再次查看您引用的示例代码块。可以使用 NSEntityDescription 创建托管对象,但是 insertNewObjectForEntityForName 的返回值是 NSManagedObjectContext *。您将其分配给 NSDescription *.
猜你喜欢
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
相关资源
最近更新 更多