1

我正在执行一个NSFetchRequest没有任何谓词的常规来获取 100 个托管对象(航班),每个Flight实体都有一个NSString名为 (flightCode) 类型的属性,并且此属性不是唯一的,因此 2 个航班对象可能具有相同的 flightCode 。但是,我想要获取所有航班对象,通过仅从相似性中获取一个航班来过滤掉具有相同航班代码的航班,即

如果 fetch 请求返回 5 个航班,如下所示:

航班 1:航班代码 =ABC

航班 2:航班代码 =AA

航班 3:航班代码 =ABC

航班4:航班代码=ABC

航班 5:航班代码 =DEF

那么 fetch 请求必须过滤掉具有 flightCode 的 3 个航班中的任意两个,ABC并且只取这 3 个中的任意一个。

NSPredicate这种过滤需要什么?

ps flight: 1, 3 & 4 的其他属性可能不同,即flight1 的名称可能与flight3 的名称不同。

提前致谢。

4

2 回答 2

1

如果您只想要所有不同航班代码的列表,这可能会满足您的需求:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight"
    inManagedObjectContext:moc];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entity.name];
request.resultType = NSDictionaryResultType;
request.returnsDistinctResults = YES;
request.propertiesToFetch = @[ entity.propertiesByName[@"flightCode"] ];

请注意,returnsDistinctResults仅在propertiesToFetch设置时才有效,并且propertiesToFetch仅在resultTypeis时才有效NSDictionaryResultType

修改

如果您想要完整Flight的对象,但每个不同的航班代码只有一个,我认为您不能直接这样做。也许您可以同时要求对象 ID 和航班代码,按航班代码分组,并取最小对象 ID,以便为每个航班代码获取一个对象 ID。objectForID:然后,您可以使用托管对象上下文将这些对象 ID 一一转换为完整对象。我会尝试这样的事情:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Flight"
    inManagedObjectContext:moc];

NSExpressionDescription *objectIDProperty = [[NSExpressionDescription alloc] init];
objectIDProperty.name = @"objectID";
objectIDProperty.expression = [NSExpression expressionForFunction:@"min:"
    arguments:@[ [NSExpression expressedForEvaluatedObject] ]];
objectIdProperty.expressionResultType = NSObjectIDAttributeType;

NSAttributeDescription *flightCodeProperty = entity.propertiesByName[@"flightCode"];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entity.name];
request.resultType = NSDictionaryResultType;
request.returnsDistinctResults = YES;
request.propertiesToFetch = @[ flightCodeProperty, objectIDProperty ];

request.propertiesToGroupBy = @[ flightCodeProperty ];

我从这个答案中抄袭了很多。我不知道它是否有效,或者我是否在正确的轨道上。如果它完全运行,但没有给出正确的输出,请记住,您可以通过添加-com.apple.CoreData.SQLDebug 1命令行参数来查看它正在执行的 SQL。

于 2013-06-26T05:24:02.020 回答
0

您需要为所有航班制作一个NSMuteableArray,然后单独制作一个NSMuteableArray以跟踪您已经看到的元素

伪代码:

NSMuteablearray flights
NSMuteablearray alreadySeen


for (item in flights) {
if (alreadySeen containsObject:item)
     flights removeObject:item
else
     alreadySeen addObject:item

}
于 2013-06-25T20:29:53.667 回答