【问题标题】:Is it possible to fetch only selected property in a Core Data query是否可以在核心数据查询中仅获取选定的属性
【发布时间】:2011-09-09 20:38:50
【问题描述】:

我有(我猜)典型的问题。我的核心数据数据库包含表,其中有 BLOB 字段和相当长的文本字段。

通常我不需要加载那些大尺寸的字段。由于数据库中有几千条记录,我宁愿只获取我真正需要的数据。换句话说,我想做“SELECT name, id FROM TAB_NAME”查询,而不是“SELECT * FROM TAB_NAME”查询。

有没有办法使用 Core Data 只获取选定的字段?或者我应该寻找其他选项,例如,将大字段分隔到另一个表中?也许有更好(更简单)的方法来做到这一点?

我习惯于使用 Hibernate 或 JPA,在查看 Core Data 文档后,我没有看到这样的选项。

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    换句话说,我想进行“SELECT name, id FROM TAB_NAME”查询,而不是“SELECT * FROM TAB_NAME”查询。

    这个问题的答案已被接受,但仅供参考,以下是如何使用 Core Data 仅获取实体的特定属性,而不重构您的模型:

    // build your NSFetchRequest
    // ...
    
    [request setResultType:NSDictionaryResultType];
    [request setPropertiesToFetch:
      [NSArray arrayWithObjects:@"property1", @"property2", /* etc. */ nil]];    
    

    另请参阅NSFetchRequest 的文档。

    【讨论】:

    • 那么,这正是我需要的
    • 顺便说一句,根据文档,您应该传递 NSPropertyDescription 对象的数组。
    • @RudolfAdamkovic 查看NSFetchRequest.h 头文件,实际上暗示该数组可以是either NSPropertyDescription OR @ 的集合987654326@ 个对象。
    • @octy setResultType 是什么意思?
    【解决方案2】:

    我认为在这种情况下,您可能希望将较大的字段(您不想加载的字段)保留在单独的实体上,并为此创建 1:1 的关系。这样,即使你的对象出错了,你也只会获取“较轻”的属性,而要获取你会使用关系的较重的属性。

    【讨论】:

      【解决方案3】:

      Core Data 已经以faulting 的形式进行“延迟加载”:故障仅在需要时从存储中提取数据,从而减少了内存和性能开销。另请阅读Core Data Performance 文档了解更多信息:

      BLOB 通常表示实体的属性,例如,照片可能是 Employee 实体的属性。对于小到中等大小的 BLOB(和 CLOB),您应该为数据创建一个单独的实体并创建一对一的关系来代替属性。例如,您可以创建 Employee 和 Photo 实体,它们之间具有一对一的关系,其中从 Employee 到 Photo 的关系替换了 Employee 的 photo 属性。这种模式最大化了对象故障的好处(请参阅“故障和唯一性”)。任何给定的照片只有在实际需要时才会被检索(如果关系被遍历)。

      【讨论】:

      • 是的,但是错误会获取给定对象的所有字段,对吗?来自文档:“如果你向 Department 对象发送一条消息以获取它的名称,那么就会触发故障——在这种情况下,Core Data 会为你执行一次获取以检索所有对象的属性。”
      • 看来 André 是对的,错误在于延迟加载关系
      • @AlexReynolds 所以 setPropertiesToFetch 不起作用?
      猜你喜欢
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2015-04-24
      • 2019-04-11
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多