2017-05-30 27 views
1

我的核心数据表是这样的:如何获得基于一个字段从核心数据不同的结果

enter image description here

我想从每个发件人获得最新消息。所以结果应该是这样的:

enter image description here

这是我的代码:

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"MyCoreDataObject" inManagedObjectContext:moc]; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"MESSAGE <> ''"]; 

    request.predicate = predicate; 
    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"TIME" ascending:NO]; 
    NSArray *sortDescriptors = @[sd1]; 
    [request setSortDescriptors:sortDescriptors]; 
    [request setEntity:entityDescription]; 
    NSError *error; 
    NSArray *msgs = [moc executeFetchRequest:request error:&error]; 

我将得到所有排序的数据(最新消息第一次)。 但是我怎样才能得到基于发件人的唯一值?所以每个发件人只有最新的消息?

基本上我需要相当于这个SQL语句:

SELECT message, sender, MAX(time) as maxTime FROM myTable GROUP BY sender; 

回答

1

获取消息字段是最难的部分。

基本上,如果您使用组,您只能通过(发件人)和具有表达式(时间)的属性获取组中的属性。

要获取所有其他值,您需要使用获取的值(发送者和时间)并执行另一次获取以从核心数据获取值。

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"MyCoreDataObject" inManagedObjectContext:moc]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"message <> ''"]; 

request.predicate = predicate; 
NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:NO]; 
NSArray *sortDescriptors = @[sd1]; 
[request setSortDescriptors:sortDescriptors]; 
[request setEntity:entityDescription]; 

NSExpressionDescription *timestampExp = [[NSExpressionDescription alloc] init]; 
[timestampExp setExpression:[NSExpression expressionWithFormat:@"@max.time"]]; 
[timestampExp setName:@"time"]; 
[timestampExp setExpressionResultType:NSDateAttributeType]; 

[request setSortDescriptors:sortDescriptors]; 
[request setEntity:entityDescription]; 
[request setResultType:NSDictionaryResultType]; 
[request setPropertiesToGroupBy:[NSArray arrayWithObject:@"sender"]]; 
[request setPropertiesToFetch:[NSArray arrayWithObjects:@"sender", timestampExp, nil]]; 

NSError *error; 
NSArray *msgs = [moc executeFetchRequest:request error:&error]; 
for (NSDictionary *msg in msgs) { 
    request = [[NSFetchRequest alloc] init]; 
    predicate = [NSPredicate predicateWithFormat:@"message <> '' and sender = %@ and time = %@ ", msg[@"sender"], msg[@"time"]]; 

    request.predicate = predicate; 
    [request setSortDescriptors:sortDescriptors]; 
    [request setEntity:entityDescription]; 
    NSDictionary *myMessage = [moc executeFetchRequest:request error:&error][0]; 

} 
相关问题