2014-11-29 2 views
0

У меня 2 класса: событие и участник. Вот их атрибуты.Запрос по возрастанию по полю NSDate указателя

Событие:

  • NSDate STARTINGDATE
  • NSString название

Участник:

  • PFUser пользователь событие
  • Event
  • и некоторые другие атрибуты, которые мне понадобятся позже

Когда пользователь хочет участвовать в событии, я создаю объект-участник и назначаю ему событие, а также пользователя. Позже я хочу получить все события, у которых есть участники для текущего пользователя. И эти события нужно заказывать, начиная с даты начала.

Я создал запрос, который получает всех участников для текущего пользователя, и я прочитал от него атрибут события, но мне действительно нужно, чтобы события были упорядочены по его начальной дате. Как мне подойти к этому. Я создал класс участника, потому что мне нужно сохранить данные, созданные пользователем для этого события.

EDIT: Я попытался это одно:

PFQuery *eventQuery = [Event query]; 
[eventQuery orderByAscending:@"startingDate"]; 

PFQuery *participantQuery = [Participant query]; 
[participantQuery includeKey:@"user"]; 
[participantQuery includeKey:@"event"]; 
[participantQuery whereKey:@"user" equalTo:[PFUser currentUser]; 
[participantQuery whereKey:@"event" matchesQuery:eventQuery]; 
[participantQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    NSMutableArray *eventsArray = [NSMutableArray new]; 
    for (Participant *participant in objects) { 
     [eventsArray addObject:participant.event]; 
    } 
}]; 

here I can use eventsArray 

Но это один раз игнорирует [eventQuery orderByAscending:@"startingDate"]; линию. Мне также нужно спросить мнение, что я выбираю подход, чтобы сначала получить участников, а затем поместить их в цикл for, чтобы получить их события и сохранить их в массиве. Это хорошо? Кажется неправильным, почему мне нужно забрать участника, если мне нужны события для пользователя.

ответ

3

Если класс событий имел ссылку на класс участника (либо как Array или Relation<Participant> в зависимости от размера) с именем participants, то вы могли бы сделать что-то вроде следующего:

PFQuery *eventQuery = [Event query]; 

PFQuery *participantQuery = [Participant query]; 
[participantQuery whereKey:@"user" equalTo:[PFUser currentUser]]; 

[eventQuery whereKey:@"participants" matchesQuery:participantQuery]; 
[eventQuery orderByAscending:@"startingDate"]; 
[eventQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    // objects array contains your Event objects 
}]; 

Вам просто нужно обновить код, который создает объекты Participant, а также добавить его в столбец participants объекта Event.

+0

У меня уже есть отношение к именованным участникам, и если я посмотрю на анализ, участник будет сохранен в этом отношении. Но этот запрос не работает.Консоль в xcode скажет мне ** Ошибка: плохой тип для $ inQuery ** Я думаю, что он имеет какое-то отношение к этой строке '[eventQuery whereKey: @" участники "matchesQuery: memberQuery];' Может быть, вы не можете выполнить запрос сверху отношение. Может кто-нибудь подтвердить это. –

+0

Я использую этот тип запроса, чтобы проверить, находится ли пользователь в отношении 'users' в классе' Role' все время (т. Е. Это используется в роли администратора). Он работает нормально. Убедитесь, что столбец 'members' имеет тип' Relation '(посмотрите заголовок столбца в браузере данных). Ошибка указывает, что тип столбца и тип объекта, который вы сравниваете, не совпадают. –

+0

Благодарим за отзыв. Я был уверен, что сделал все правильно, но я снова проверил, и понял, что изменил имя атрибута отношений. Я попробую этот метод, и если все будет хорошо работать, я отбираю ваш ответ как правильное решение. Спасибо за ваше время. –

1

Более простой способ упорядочить объекты Участника, чтобы упорядочить их локально после извлечения. Используйте sortUsingDescriptors: на NSMutableArray.

Попробуйте это:

PFQuery *participantQuery = [Participant query]; 
[participantQuery includeKey:@"user"]; 
[participantQuery includeKey:@"event"]; 
[participantQuery whereKey:@"user" equalTo:[PFUser currentUser]; 
[participantQuery whereKey:@"event" matchesQuery:eventQuery]; 
[participantQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    NSMutableArray *eventsArray = [NSMutableArray arrayWithArray:objects]; 
    NSArray *descriptors = [NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:@"event.startingDate" ascending:YES],nil]; 
    NSMutableArray *sortedArray = [eventsArray sortUsingDescriptors:descriptors]; 
}]; 

(Обратите внимание на использование обозначений точек на дескрипторе, чтобы получить свойство имущества - в данном случае, свойство STARTINGDATE на свойстве события.)

+0

Это был мой план B. Единственная проблема заключается в том, что если есть более 1000 событий, я могу получить только 1000 из них (ограничение синтаксического разбора), и таким образом существует вероятность того, что некоторые из событий, которые должны присутствовать первыми отсутствуют в массиве. –

+0

Хорошо, я принимаю это за ответ. Он работает для большинства сценариев. Thansk –

Смежные вопросы