【问题标题】:NSPredicate to fetch last message for each conversation in core dataNSPredicate 为核心数据中的每个对话获取最后一条消息
【发布时间】:2016-01-29 07:50:44
【问题描述】:

我有一个名为 messages 的实体,具有以下属性: -> message_id, message_from, message_to, message_body, date_created.

我想为每个用户获取最后一个message,就像我们在 WhatsApp 聊天中一样。

我找到了MySQL的以下代码,但不知道如何与NSPredicates一起使用:

SELECT *
FROM messages m1
WHERE date_created = (SELECT MAX(m2.date_created)
                      FROM messages m2
                      WHERE m1.message_from = m2.message_from
                        AND m1.message_to = m2.message_to)

有人可以帮我使用NSPredicate从核心数据中获取每个用户的最后一条消息吗?

【问题讨论】:

    标签: objective-c core-data nspredicate


    【解决方案1】:

    首先,您需要一个提取所有消息和所有用户的方法。为简单起见,将其放在您的 AppDelegate.m 中。请注意,getAllMessages 通过将数据提取为 NSDictionary 来获得唯一结果,根据定义,NSDictionary 不允许重复键

    -(NSArray*)getAllUsers
    {
        // initializing NSFetchRequest
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
        //Setting Entity to be Queried
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message"
                                              inManagedObjectContext:self.managedObjectContext];
        fetchRequest.resultType = NSDictionaryResultType;
        fetchRequest.returnsDistinctResults = YES;
        [fetchRequest setEntity:entity];
        [fetchRequest setPropertiesToFetch:@[@"userId"]];
        fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date_created" ascending:NO]];
    
        NSError* error;
    
        // Query on managedObjectContext With Generated fetchRequest
        NSArray *fetchedRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    
        // Returning Fetched Records
        return fetchedRecords;
    }
    
    -(NSArray*)getAllMessages
    {
        // initializing NSFetchRequest
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
        //Setting Entity to be Queried
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Message"
                                              inManagedObjectContext:self.managedObjectContext];
        fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"date_created" ascending:NO]];
        [fetchRequest setEntity:entity];
        NSError* error;
    
        // Query on managedObjectContext With Generated fetchRequest
        NSArray *fetchedRecords = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    
        // Returning Fetched Records
        return fetchedRecords;
    }
    

    然后您可以通过执行以下操作提取每个用户的最后一条消息并将其放入 NSMutableArray 中:

    AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSMutableArray * arrayUsers = [NSMutableArray arrayWithArray:[appDelegate getAllUsers]];
    NSMutableArray * arrayMessages = [NSMutableArray arrayWithArray:[appDelegate getAllMessages]];
    
    NSMutableArray * lastMessageForEachUser = [NSMutableArray array];//on this array you get the results 
    for (NSDictionary * dict in arrayUsers)
    {
        NSNumber * userId = [dict objectForKey:@"userId"];
        NSPredicate * pr = [NSPredicate predicateWithFormat:@"userId == %@",userId];
        NSArray * results = [arrayMessages filteredArrayUsingPredicate:pr];
        Message * lastMessage = results.count>0 ? [results objectAtIndex:0] : nil;
        [lastMessageForEachUser addObject:lastMessage]; 
    }
    

    【讨论】:

    • 我想获取所有用户的最后一条消息,但我不知道表中存在哪些用户。所以,我不能用'userId'来检查它。
    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多