NSPredicate:获取各种类型之一

arn*_*app 20 iphone objective-c nspredicate nsfetchedresultscontroller ios

我想创建一个NSFetchRequest像这样的对象:

ObjectCar其具有attribute color.我有四辆车:

car1.color = red
car2.color = red
car3.color = blue
car4.color = green
Run Code Online (Sandbox Code Playgroud)

我想创建一种NSPredicate只为每种颜色选择一辆汽车(它选择哪辆车无关紧要.

我怎样才能做到这一点?

事实上,我正在寻找类似于DISTINCTSQL的东西

nie*_*bot 19

核心数据确实支持获取不同的值.Apple甚至在这里提供示例代码:http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/fetchExpressions.html


从该页面:

获取不同的值

要在给定实体的所有实例中获取特定属性的唯一值,请使用setReturnsDistinctResults:方法配置获取请求(并将YES作为参数传递).您还指定fetch应返回字典而不是托管对象,以及要获取的属性的名称.

Swift 2.0

let context:NSManagedObjectContext! = <#Get the context#>
let entity = NSEntityDescription.entityForName( "<#Entity name#>",  inManagedObjectContext:context )
let request = NSFetchRequest()
request.entity = entity
request.resultType = .DictionaryResultType
request.returnsDistinctResults = true
request.propertiesToFetch = [ "<#Attribute name#>" ]

var objects:[[String:AnyObject]]?
do
{
    try objects = context.executeFetchRequest( request )
}
catch
{
    // handle failed fetch
}
Run Code Online (Sandbox Code Playgroud)

OBJ-C

NSManagedObjectContext *context = <#Get the context#>;  

NSEntityDescription *entity = [NSEntityDescription  entityForName:@"<#Entity name#>" inManagedObjectContext:context];  
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES]; 
[request setPropertiesToFetch:@[@"<#Attribute name#>"]];  

// Execute the fetch. 

NSError *error = nil; 
id requestedValue = nil; 
NSArray *objects = [context executeFetchRequest:request error:&error]; 
if (objects == nil) {
    // Handle the error. 
} 
Run Code Online (Sandbox Code Playgroud)

(一个"问题"是结果将作为字典返回 - 如果您需要对象,则可以执行另一次提取以通过ID获取它们)


ggr*_*ana 14

你试过用valueForKeyPath吗?您可以在NSPredicate为您提供的数组中执行类似的操作.

NSArray* distinctColors = [cars valueForKeyPath:@"@distinctUnionOfObjects.color"];
Run Code Online (Sandbox Code Playgroud)

它会给你带来你所拥有的鲜明颜色,我不知道它是不是你想要的颜色,但是你可以用@Anupdas这样的颜色告诉你: