Coredata propertiesToFetch - 它是如何工作的?

时间:2018-03-20 09:12:51

标签: ios core-data nsfetchrequest

我只需要从实体中获取单个属性的值,而不需要不必要地获取所有属性。为实现这一点,我尝试使用' propertiesToFetch'具有我的获取请求的属性,但它似乎返回实体的所有属性值。

说,我有一个名为' Person'它具有属性' name',' age',' height',' weight'。现在我只需要获得高度值。我的获取请求如下

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
request.propertiesToFetch = ["height"]

现在当我检索这些值时,我希望每个人的名字,年龄,体重都是零,而所有人都只有身高值。 但事实并非如此,我仍然可以看到名称,年龄,重量的值,在我看来所有属性都试图被提取,我想避免。

以上只是一个例子。当我处理大量数据时,我试图通过尽可能只获取必要的值来优化获取时间。 有人可以指出我在这里缺少什么来使它成为正确的吗?

1 个答案:

答案 0 :(得分:0)

我在您的实体中有大量数据,并且您不希望每次对象出现故障时将其加载到内存中,解决方案就是使用关系。通常,大量数据是单个属性(imageData或类似的东西),并且可以与具有单个属性的实体更改为一对一关系。这将允许您轻松评估数据(即myObject.dataHolder.data而不是myObject.data),但您无法通过它进行搜索或排序。对于您不需要搜索或排序的所有属性,您可以执行相同的操作,但除非这些属性非常大,否则我不会看到很大的回报。

正如评论中所指出的,propertiesToFetch仅适用于dictionaryResultType,对于需要托管对象子类的大多数应用程序而言,class ActiveRecord extends BaseActiveRecord { public static function find() { return parent::find() ->onCondition([ ['=',static::tableName().'.company_id',Yii::$app->user->identity->company_id], ['=',static::tableName().'.branch_id',Yii::$app->user->identity->branch_id] ]); } } 通常不是一个好的解决方案。