0

我正在使用 iphone 中的核心数据实现聊天数据库。我创建了两个实体聊天用户和聊天消息。并且chatuser 和chatmessgae 实体之间存在一对多的关系。对于一个聊天用户,可以有许多聊天消息。我正在存储数据

NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Chatuser"    
                                                  inManagedObjectContext:self.managedObjectContext];
        [request setEntity:entity];   

        NSPredicate *pred = [NSPredicate predicateWithFormat:@"chatuser == %@", chatuser];
        [request setPredicate:pred];

        NSArray *userArray=[self.managedObjectContext executeFetchRequest:request error:&error];


        if ([userArray count] > 0){
            Chatuser *user = [userArray objectAtIndex:0];

            Chatmessage *message = [NSEntityDescription insertNewObjectForEntityForName:@"Chatmessage" inManagedObjectContext:self.managedObjectContext];
            message.chatmessage = chatmessage;

            [user addAllchatmessagesObject:message];
            NSError *error;

            if(![self.managedObjectContext save:&error])
            {
                NSLog(@"whoops, couldn't save: %@", [error localizedDescription]);
            }           

        }
//    }
    else 
    {
        Chatuser *user = [NSEntityDescription insertNewObjectForEntityForName:@"Chatuser" inManagedObjectContext:self.managedObjectContext];
        user.chatuser = chatUser;

        Chatmessage *message = [NSEntityDescription insertNewObjectForEntityForName:@"Chatmessage" inManagedObjectContext:self.managedObjectContext];
        message.chatmessage = chatmessage;

        [user addAllchatmessagesObject:message];
        NSError *error;

        if(![self.managedObjectContext save:&error])
        {
            NSLog(@"whoops, couldn't save: %@", [error localizedDescription]);
        }
    }

并以这种方式获取数据

managedObjectContext = appDelegate.managedObjectContext;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Chatuser" inManagedObjectContext:self.managedObjectContext];
    [request setEntity:entity];
    NSError *error;

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"chatuser == %@", appDelegate.chatUser];
    [request setPredicate:pred];

    NSArray *userinfo = [self.managedObjectContext executeFetchRequest:request error:&error];

    if([userinfo count]>0)
    {

        Chatuser *user = [userinfo objectAtIndex:0];
        NSSet *messageset = user.allchatmessages;
        self.messageinfo = [messageset allObjects];
        int message_count=[self.messageinfo count];
        NSLog(@"Message count : %d", message_count);
        for(int i=(message_count-1);i>=0;i--)
        {
            Chatmessage *chatmsgnew = [self.messageinfo objectAtIndex:i];
            [tableArray addObject:chatmsgnew.chatmessage];
        }
    }

现在的问题是聊天消息没有按照我存储它们的顺序出现。就像我正在存储消息 1、2、3、4。并且在获取 2,1,4,3 的同时......我没有遇到问题。任何人都可以提出任何建议。

4

1 回答 1

0

获取请求不一定按照对象插入数据库的顺序返回对象。如果你需要一个特定的顺序,你必须为messageId实体添加一个整数属性(例如),并在获取请求中添加一个排序描述符:

NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"messageId"
         ascending:YES];
[request setSortDescriptors:@[sort]];

补充:Chatmessage如果您获取对象,上述方法有效。因此,您可以为实体Chatuser创建一个获取请求,而不是获取第一个请求,其谓词如下Chatmessage

[NSPredicate predicateWithFormat:@"user.chatuser == %@", appDelegate.chatUser]

(假设“用户”是从ChatmessageChatuser的反向关系),以及上述排序描述符。

或者,如果你有一个Chatuser对象,那么你可以user.allchatmessages这样排序:

NSSet *messageset = user.allchatmessages;
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"messageId"
         ascending:YES];
self.messageinfo = [[messageset allObjects] sortedArrayUsingDescriptors:@[sort]];
于 2013-04-04T06:02:20.527 回答