【问题标题】:NSFetchRequest with resultType set to NSDictionaryResultType and saving of changed objects将 resultType 设置为 NSDictionaryResultType 的 NSFetchRequest 并保存更改的对象
【发布时间】:2015-11-30 02:02:33
【问题描述】:

基于一些有限的测试,我发现如果我

  1. 执行结果类型 = NSDictionaryResultType 的 Fetch 请求
  2. 对返回的值进行一些操作
  3. 存储执行 Fetch 请求的 MOC

步骤 2 中的更改不会写回持久存储,因为我正在更改字典而不是“托管对象”。这是正确的理解吗?

【问题讨论】:

    标签: ios cocoa core-data nsfetchrequest


    【解决方案1】:

    您很可能在滥用字典结果类型。与传统的数据库编程不同,由于一种称为“故障”的底层机制,在获取整个对象而不是仅一个选定的属性时,您不会浪费宝贵的内存资源。

    尝试使用托管对象结果类型(默认)获取,您可以非常轻松地操作对象并将它们保存回 Core Data。您不需要为了获取要更改的对象而进行额外的提取。

    只有在数据量大、关系分组逻辑困难等特殊情况下才考虑字典,这绝对是必要的。

    (话虽如此,它不太可能是绝对必要的。我还没有遇到过这样的情况,即需要字典进行提取不是数据模型设计缺陷的间接结果。)

    【讨论】:

    • 谢谢,是否只检索 ManagedObjects 然后对内存中的 ManagedObjects 进行过滤会更快(而不是在核心数据获取期间使用 Pedicate)。如果是,如何在托管对象上设置谓词?这是我通常使用 Result 类型作为 Dictionary 的原因之一,因为我知道如何进行后续过滤。
    • 恰恰相反。您当然应该通过在获取请求中使用谓词来获取尽可能少的记录。很多时候,内存过滤会减少到最低限度。至于速度,我认为我的方法可能比字典快,但这需要通过测试来验证。
    【解决方案2】:

    是的,您不能将字典直接存储回上下文中,因此您不能以这种方式保存任何更新。

    如果您获得一个字典对象,那么您需要在其中包含相关的托管对象 ID(如果它没有被聚合)或执行另一个获取以获取要更新的对象。

    【讨论】:

    • 谢谢。您能否说明第一种方法“在其中包含关联的托管对象 ID”。根据您的回答,看起来我可以将提取结果作为字典取回,进行更改并将其存储回数据存储,而无需额外的提取请求。对吗?
    • 看到这个答案stackoverflow.com/a/4792331/1988185 是的,你只需在上下文中使用获取现有对象。
    猜你喜欢
    • 2021-10-03
    • 2013-05-05
    • 2023-03-19
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多