【问题标题】:Create entity in MOC but don't insert it在 MOC 中创建实体但不插入它
【发布时间】:2014-12-16 14:36:49
【问题描述】:

我的实体上有允许我将 JSON 解析为实体的类别:

- (id) populateFromJson: (NSDictionary *) json {
   ...
}

那么使用 MagicalRecord 我可以做到这一点:

MyEntity *e = [My MR_createInContext:localContext];
[e populateFromJson:json];

但是,在我将其解析为实体后,我需要检查它是否已存在于主上下文中,即检查是否存在重复项。如果它已经存在于主上下文中,我不想将它插入到上下文中,但是我找不到使用 MagicalRecord 创建实体作为上下文的一部分的方法,但不要插入到该上下文中。

在核心数据中你可以这样做:

MyEntity *e = [[MyEntity alloc] initWithEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:[NSManagedObjectContext MR_defaultContext]] insertIntoManagedObjectContext:nil];

将 nil 传递给要插入的上下文。

然后,如果不是重复,您可以:

[localContext insertObject:e];

是我遗漏了什么,还是在 MagicalRecord 中没有办法做到这一点?

【问题讨论】:

  • 您的MyEntity *e = [[MyEntity alloc] initWithEntity ... 创建对象而不将其插入上下文。正如您前面的文字所暗示的那样,该对象不是“上下文的一部分”。即使使用 MagicalRecord,您也可以调用所有 Core Data 方法,但我假设您会得到与 MyEntity *e = [My MR_createInContext:nil] 相同的结果。
  • MyEntity *e = [My MR_createInContext:nil] 引发异常。这是因为 MR 尝试使用 nil 作为实体的上下文以及要插入的上下文。我的代码只使用 nil 作为插入的上下文。

标签: ios core-data magicalrecord


【解决方案1】:

如果有重复,根本不创建对象可能更简单。例如,如果您有 JSON 中的主键,则可以在创建对象之前使用该主键(当然,您的主键属性需要是您创建的东西)获取对象。

【讨论】:

  • 我认为你是对的。不幸的是,没有办法只创建一个未附加到上下文的普通旧对象。在我的情况下,这确实是我想要做的,将 json 编组为一个对象,以便我可以访问该对象的属性以查看它是否是一个 dup。在我的情况下,我将不得不手动提取一些属性,检查 dup 然后创建实体并将 json 编组到实体中。重复了一些工作,但可能是核心数据 api 工作方式的“最佳”方式。
  • 看来您可以在没有上下文的情况下创建一个对象,然后在确定该对象不存在后,稍后在该上下文上调用insertObject:stackoverflow.com/a/3868651/131779这个我没试过,所以不能保证,但值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2021-08-12
  • 2015-05-29
  • 2022-07-30
相关资源
最近更新 更多