Objective c 如果核心数据存在于另一个表中,则要求其获取数据。目标C

Objective c 如果核心数据存在于另一个表中,则要求其获取数据。目标C,objective-c,core-data,nspredicate,Objective C,Core Data,Nspredicate,目前,我正在尝试使用以下核心数据进行查询 我想查询: 存在于Room_消息上的所有文件室 目前我有以下代码 // Initialize Fetch Request NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Rooms"]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"room_messages

目前,我正在尝试使用以下核心数据进行查询

我想查询:

存在于Room_消息上的所有文件室

目前我有以下代码

// Initialize Fetch Request
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Rooms"];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"room_messages.@count > 0"];
    // also tried room_messages.@count != 0 but the same thing no results
    [fetchRequest setPredicate:predicate];

    NSError *error;
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"last_seen_date" ascending:NO];
    [fetchRequest setSortDescriptors:@[sortDescriptor]];

    // Initialize Fetched Results Controller
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                        managedObjectContext:[[coreDataHelpers sharedInstance] managedObjectContext]
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];

    self.fetchedResultsController.delegate = self;

    BOOL success = [self.fetchedResultsController performFetch:&error];
    if (!success) {
        if (error) {
            NSLog(@"FetchedResultsController failed with error: %@", error.localizedDescription);
        }
    }

这是聊天室对话列表。我只需要向用户显示包含消息的房间。那些在房间信息上没有信息的人不需要它们。。直到他们在我的查询结果上有消息。

您需要筛选消息计数为零的房间。假设与“Message”的多对多关系称为
messages

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"messages.@count > 0"];

我找到的问题答案提供了我想要的结果,尽管我不知道这是否是最好的答案。在保存新的输入消息之前,我必须添加这行代码

[messageObject addRoomsObject:roomObject];
RoomObject只是该特定消息的房间的键值,所以假设我插入了一条新消息。此邮件属于特定的房间。这个房间的价值就是我从钥匙里得到的。所以我最后的代码是

// Create a new managed object
    Message *messageObject = [NSEntityDescription insertNewObjectForEntityForName:@"Message"
                                                     inManagedObjectContext:[[coreDataHelpers sharedInstance] managedObjectContext]];

    messageObject.message  = payload[@"message"];
    messageObject.date = [NSDate date];
    messageObject.type_message = payload[@"type_message"];
    messageObject.room_key = [NSString stringWithFormat:@"%@", payload[@"room"]];
    messageObject.user_id = payload[@"user_sender"];
    messageObject.read = @YES;
    // Make relation between both Entitites
    [messageObject addRoomsObject:roomObject];

    NSError *error;
    BOOL saved = [[[coreDataHelpers sharedInstance] managedObjectContext] save:&error];

    if (!saved) {
        if (error) {

            [self makeAlert:@"Error"
                   subTitle:error.localizedDescription
                   buttonOk:@"Ok"];

        }
    }
    else {
        [SimpleAudioPlayer playFile:@"message_sent.aiff"];

        [[coreDataHelpers sharedInstance] lastSeenRoom:payload[@"room"] lastMessage:payload[@"message"]];
        [[coreDataHelpers sharedInstance] updateLastSeenDateUser:payload[@"user_sender"]];

    }

我更新了我的问题描述并添加了图片,你能看一下吗。。根据你所做的预测。谢谢你,我的回答仍然不起作用。。任何基于@mundiI图像的想法都应该可行。您可能没有将消息分配给房间。我分配了@mundi,但它没有显示任何结果。我得到了0行。这很奇怪。如果谓词不正确,它通常会抛出一个错误。尝试使用
=0
,看看是否获得了预期的所有记录。