如何在Core Data中获取不同的值?

时间:2010-05-07 02:39:24

标签: iphone core-data

所以在查看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”声明中给出了一个关于未使用变量的编译器警告。我觉得我在这里错过了一些东西。

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

1 个答案:

答案 0 :(得分:28)

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

字典的键与您提取的属性相同,并在模型中定义。因此,例如,如果您有一个定义了三个属性的person实体,name,age,phoneNumber,并且您只请求了name,那么这将是您词典中唯一包含数据的键。所以:

[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:中设置的数组中。

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