سؤال

I save to core data and load all messages with code below, but how can I load only messages for 2 users, for self user and for destination user, I want base it on user JID.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSManagedObjectContext *context = [[self appDelegate].xmppMessageArchivingCoreDataStorage mainThreadManagedObjectContext];
NSEntityDescription *messageEntity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject" inManagedObjectContext:context];
fetchRequest.entity = messageEntity;
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSError *error = nil;
NSArray *results = [context executeFetchRequest:fetchRequest error:&error];
//Now you get the NSArray with element type of "XMPPMessageArchiving_Message_CoreDataObject"
هل كانت مفيدة؟

المحلول

assuming your message objects have a from relationshit to a User entity.
As simple as adding (before executing the request):

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"from = %@ OR from = %@",selfUser,otherUser];

Where selfUser and otherUser are User core data managed objects or managed object IDs of users.

if you use a field identifier (highly not recomended):

 fetchRequest.predicate = [NSPredicate predicateWithFormat:@"bareJID.bare = %@ OR bareJID.bare = %@",selfUser.jid,otherUser.jid];

You might want to read THIS

نصائح أخرى

I have used following method and it worked correctly :)

-(void)checkForPastMessageAndDisplayIt
{
    NSString *strmyid = @"user1@domain";
    NSString *strBuddy = @"user2@domain";

    NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_message_achiving];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
                                              inManagedObjectContext:moc];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@ OR bareJidStr = %@", strmyid, strBuddy];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *messagesArray = [moc executeFetchRequest:fetchRequest error:&error];
    [messagesArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id messageObject = [messagesArray objectAtIndex:idx];
        if ([messageObject isKindOfClass:[XMPPMessageArchiving_Message_CoreDataObject class]]) {

            XMPPMessageArchiving_Message_CoreDataObject *currentMessageCoreDataObject = (XMPPMessageArchiving_Message_CoreDataObject*)messageObject;
            XMPPMessage *message = currentMessageCoreDataObject.message;
            if (message!=nil) {
                [messages addObject:message];
            }

        }
    }];
}

You can use like that

-(void)testMessageArchiving {

    NSString *strmyid = @"myid";
    NSString *strBuddy ="toid";
    NSLog(@"my id and buddy is is %@ and %@",strmyid,strBuddy);

    XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
    NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
                                                         inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc]init];

    request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@ OR bareJidStr = %@", strmyid, strBuddy];

    NSError *error;
    NSArray *messages = [moc executeFetchRequest:request error:&error];

    // NSLog(@"the history of messages is %@",messages);

    [self print:[[NSMutableArray alloc]initWithArray:messages]];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top