【问题标题】:How to fetch distinct values in Core Data?如何在 Core Data 中获取不同的值?
【发布时间】:2011-02-16 16:03:32
【问题描述】:

所以在查看Core Data Snippets时,我发现了以下代码:

...
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctValues:YES];
[request setPropertiesToFetch:[NSArray arrayWithObject:@"<#Attribute name#>"]];

// Execute the fetch
NSError *error;
id requestedValue = nil; // WTF? This isn't defined or used anywhere
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
     // handle the error
}

这很棒,看起来很适合我的需要......但是如何实际使用它?我假设因为它正在返回字典,所以我需要一个键来获取值 - 但是键在哪里定义?那是“id requestedValue = nil”行吗?如果是这样,“requestedValue”如何成为关键? Xcode 在“requestedValue”声明中给我一个关于未使用变量的编译器警告。我觉得我在这里遗漏了一些东西。

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    requestedValue 什么都不是,显然没有被使用(也许它是其他一些示例的一部分,被剪切并粘贴到这个示例代码中——谁知道呢)。你可以忽略它。

    字典的键与您获取的属性相同,并在您的模型中定义。因此,例如,如果您有一个定义了三个属性(姓名、年龄、电话号码)的人员实体,并且您只请求姓名,那么这将是您的字典中唯一包含数据的键。所以:

    [request setEntity:entity]; 
    [request setResultType:NSDictionaryResultType];
    [request setReturnsDistinctResults:YES];
    [request setPropertiesToFetch:[NSArray arrayWithObject:@"name"]];
    
    // Execute the fetch
    NSError *error;
    NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
    if (objects == nil) {
         abort();
    }
    for( NSDictionary* obj in objects ) {
      NSLog(@"Person: %@", [obj objectForKey:@"name"]);
    }
    // ...
    

    因此,如果您的数据存储中有 5 个名为 Bob、Sally、Joe、Freida 和 Sue 的人,您会看到这些名字打印出来。如果您想使用任何其他属性(例如他们的年龄),则必须将其添加到您在 setPropertiesToFetch: 中设置的数组中。

    但是,在大多数情况下,最好简单地检索托管对象。该对象将出现故障,因此除非您实际访问它们,否则您甚至不会将属性带入内存。另外,如果您想对对象进行更改,您可以将它们保存到存储中(使用托管对象)。

    【讨论】:

    • 完美 - 感谢您的帮助。 Core Data Snippets 非常有用,但如果您是新用户,它们会留下一点想象空间。感谢您的帮助!
    • 有点“小”的想象力?他们把一切都留给想象。每当我唯一的知识来源是 Apple 编写的文档时,我都会有一种想打自己的冲动。值得庆幸的是,StackOverflow 中有很多像 Jason Coco 和其他人这样的专业人士,可以帮助我们理解 Apple 在他们的文档中编写的模糊加密信息。 Apple 的产品很棒,但他们的文档很烂 infinity squared + 1。
    • 看起来 setReturnsDistinctValues 已更改为 setReturnsDistinctResults
    • @mishod 我想一直都是这样,我想我很久以前就打错了。不管怎样,我现在已经更新了答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多