【问题标题】:setPropertiesToFetch doesn't seem to have any effectsetPropertiesToFetch 似乎没有任何效果
【发布时间】:2010-12-24 01:47:33
【问题描述】:

我试图在我的获取请求中使用 setPropertiesToFetch 来限制从我的商店中检索的数据,但它似乎没有任何效果。当我使用它并显示返回到控制台的对象时,我可以看到我的所有属性都在那里。无论我是否设置属性,都会显示相同的数据。所有关系都显示为错误,但属性的所有数据都在那里。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:context];
NSDictionary *entityProperties = [entity propertiesByName];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
[fetchRequest setIncludesPendingChanges:NO];
[fetchRequest setReturnsObjectsAsFaults:NO];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:[entityProperties objectForKey:@"myAttrib"], nil]];

无论有没有最后一行,fetch 似乎都会为每个对象返回相同的数据。有什么想法吗?

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    setPropertiesToFetch: 文档的特殊注意事项部分说

    仅当 resultType 设置为 NSDictionaryResultType 时才使用此值。

    您的代码 sn-p 没有设置 resultType。也许您打算使用 setRelationshipKeyPathsForPrefetching:?

    【讨论】:

      【解决方案2】:

      我的印象(根据 Apple 工程师的说法)是,一旦您使用该属性的访问器,数据就会因未获取的属性而出错。可能是在生成 NSManagedObject 的描述时,这些访问器被用于每个属性,导致数据在生成描述对象的字符串之前出现错误。

      您可以尝试使用 Core Data Faults 和/或 Core Data Cache Misses 工具(在模拟器中)来查看故障实际发生的时间。如果它们发生在您打印出托管对象之前,那似乎支持我上面的猜测。

      【讨论】:

      • 是的,我确实是这么想的。但是当显示关系错误时,我认为描述会显示属性错误。有意思,我去看看!谢谢!
      • 我有一个简单的问题。由于某种原因,它不允许多关系,只允许属性和 1-1 关系。这是正确的还是我遇到了某种错误?我得到:Invalid to many relationship...passed to setPropertiesToFetch:
      • 来自 -setPropertiesToFetch 的文档:“属性描述可能表示属性、一对一关系或表达式。”我认为对于多关系,他们建议使用 -setRelationshipKeyPathsForPrefetching:
      • 谢谢。抱歉,我看了很久的文档试图弄清楚,我不敢相信我没有看到那部分!以为我的文档已经过时了,但事实证明我只是没有给予足够的关注!再次感谢!
      【解决方案3】:

      试试 setReturnsDistinctResults:YES

      来自苹果文档:

      setReturnsDistinctResults:

      设置请求是否应该只为 propertiesToFetch 指定的字段返回不同的值。

      • (void)setReturnsDistinctResults:(BOOL)values

      参数 价值观 如果是,则请求仅返回 propertiesToFetch 指定的字段的不同值。

      【讨论】:

        【解决方案4】:

        setPropertiesToFetch的正确使用方式

        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];
        [fetchRequest setResultType:NSDictionaryResultType]; // Remember to setResultType
        [fetchRequest setPropertiesToFetch:
        [NSArray arrayWithObjects:@"name", @"age", nil]]; 
        NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest
                                                                       error:nil];
        
        NSArray *nameArray = [results valueForKey:@"name"];
        NSArray *ageArray = [results valueForKey:@"age"];
        

        results 不是 Person 对象 的数组,而是 Dictionary 的数组。你可以像这样访问里面的字典

        NSLog(@"%@", [results[0] valueForKey:@"name"]);
        NSLog(@"%@", [results[0] valueForKey:@"age"]);
        

        如果您只想使用 Model 对象(CoreData 获取实体的所有属性/属性),您可以使用 Person 和 PersonDetail(保存有关人员的详细信息)来设计您的模型。这边

        • 您可以执行 fetchRequest 并获取 Person 对象数组
        • 访问 aPerson.detail 时(detail 与 PersonDetail 是一对一关系),CoreData 将为您执行故障处理

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-05
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多