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

Pio*_*ski 26 iphone core-data ios

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

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

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

我习惯使用Hibernate或JPA,这里很容易做上面描述的操作,经过Core Data docs后我没有看到这样的选项.

oct*_*cty 41

换句话说,我想制作"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]];    
Run Code Online (Sandbox Code Playgroud)

另请参阅NSFetchRequest的文档.


Ale*_*lds 5

核心数据已经这样做“懒加载”的形式断层:故障只在你需要它的卖场,它可以减少内存和性能开销中提取数据。另请阅读Core Data Performance文档以获取更多信息:

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

  • 是的,但是错误会获取给定对象的所有字段,对吗?在文档中:“如果向Department对象发送消息以获取其名称,例如错误,则将引发故障,在这种情况下,Core Data将为您执行提取操作,以检索对象的所有属性。” (3认同)

And*_*jão 5

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