是否可以仅获取Core Data查询中的选定属性

时间:2011-06-07 07:40:08

标签: iphone ios core-data

我(我猜)是典型的问题。我的核心数据数据库包含表,它有BLOB字段和很长的文本字段。

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

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

我习惯使用Hibernate或JPA,它很容易做上面描述的操作,在浏览Core Data docs之后我没有看到这样的选项。

3 个答案:

答案 0 :(得分:41)

  

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

这个问题的答案已被接受,但仅供参考,这里是如何仅使用核心数据获取实体的特定属性,而无需重新分解您的模型:

// build your NSFetchRequest
// ...

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

另请参阅NSFetchRequest的文档。

答案 1 :(得分:5)

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

  

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

答案 2 :(得分:5)

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