【问题标题】:Newbie, Core data instantiate managed objects新手,核心数据实例化托管对象
【发布时间】:2017-07-26 02:47:15
【问题描述】:

这是一个关于核心数据的新手问题,因为我正在 swift 中开始开发 ios。

我不了解核心数据的机制...我如何操作,我的意思是实例化实体(托管对象)而不将它们“附加”到上下文?

假设我有一个返回汽车列表的 api。我想将我的 api 数据解析为 Car 对象列表。现在我想在进行任何数据库操作之前排除所有红色汽车。

但是,如果我将我的汽车实例化为托管对象,它们会直接附加到上下文中,因此如果我对其调用 save,它将在我创建的所有实体中执行!

创建一个新的汽车对象并不意味着我想对我的数据库进行任何类型的操作!

【问题讨论】:

  • 请分享一些您尝试过的代码。另外,看看raywenderlich.com/145809/getting-started-core-data-tutorial
  • Txs 寻求帮助,但您的链接没有回答我的问题。这不是关于代码的问题,所以我没有任何代码要发布。我想从我提到的用例中了解最佳实践。
  • 当你解析你的 JSON 对象时,当你有一辆红色汽车时,你创建一个NSManagedObject 并将你的值保存到这个。然后,在您完成解析 JSON 后保存您的上下文
  • 好吧,你的意思是 ios 上的最佳实践是在执行任何数据库操作之前操作 json,然后根据需要的值创建托管对象?不是真正的用户友好(即使我同意创建不应该使用的对象并不是真正的“性能”)
  • 我不会直接从 JSON 响应创建 NSManagedObjects。我会使用像 ObjectMapper 这样的库来首先创建像“中间”对象。然后过滤它们。然后将它们映射到 NSManagedObjects。

标签: ios swift core-data


【解决方案1】:

在保存上下文之前插入上下文然后删除的 ManagedObject 不会影响数据库。

  1. 将 managedObject(s) 插入到上下文中
  2. 过滤它们
  3. 删除不想要的。
  4. 保存上下文。

【讨论】:

    【解决方案2】:

    托管对象仅存在于上下文中。您不能孤立地创建它们。

    正如@Jon Rose 所提到的,仅仅因为您将它们插入上下文并不意味着您必须保存它们。如果您在保存上下文之前再次删除它们,它们将不会被存储。

    您可能希望在解析操作期间使用单独的上下文。您可以创建一个新的托管对象上下文,并将其设置为主要托管对象上下文的子上下文(通过在新创建的托管对象上下文上设置 parentStore 属性)。

    这样做的好处是您可以保证应用程序的其他区域不会在不合时宜的时间尝试调用save:。在您的解析器中,创建新上下文并设置其父级。创建所有对象,进行所需的所有修改/删除,然后调用 save。当您在子托管对象上下文上调用 save 时,只有这样它的所有更改才会被推送到父级。 (请注意,在子上下文中调用 save 并不会真正将内容保存到数据库中——您需要在子上下文中调用 save,然后在父上下文中调用 save,按此顺序,以便保存到数据库.)

    【讨论】:

    • 我明白,如果我不调用 save,实体就不会被保存。但我认为从与数据库无关的处理中“删除”“待处理”事务是一种危险而不是真正的逻辑。我通常在最后一点与 db 交谈,当我确定我想处理时。因为如果我稍后在我的代码上为其他条目调用 save ,它将保存不需要的实体。
    • 但我不知道我们可以像我预期的那样创建上下文! (我没有看到任何例子......)这对我来说似乎更合乎逻辑,更优雅!另一方面,使用 ObjectMapper 的 Natasha 解决方案似乎也不错,因为无论如何我都会使用它来创建我的托管对象。最佳做法是什么?创建多个上下文或处理 ObjectMapper 并在需要时创建托管对象?无论如何,你们完全理解我的问题,我已经有很多答案和 txs 给你最后的建议@Amy
    • 从托管对象上下文中删除东西并不危险。但我同意多重上下文更优雅。
    • 如果上下文是从父上下文中明确定义的,这并不危险。
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多