2015-01-06 5 views
0

Мне нужно сделать простой запрос с помощью Parse.Порядок сортировки сортировки по указателю

У меня есть два класса: Captain и Boat.

Каждый Captain имеет объект-указатель Boat.

Я список всех Captain объектов в таблице с их атрибутами, такими как имя, Boat имя и т.д.

мне нужно, чтобы иметь возможность сортировать запрос о Captain объектов, через имя Boat. Как я могу?

Я могу сортировать прямой атрибут с помощью ключа сортировки NSSortDescriptor, например Captainname. Но мне нужно отсортировать объекты Captain по name их Boat.

Пожалуйста, помогите!

+0

Пожалуйста, опишите, почему вы голосуете, или я не могу исправить ошибки. –

+0

Я не спускал вниз, но было бы полезно, если бы вы разместили код того, что вы уже пробовали, и объяснили конкретные проблемы с вашим текущим кодом. –

ответ

4

Было бы хорошо, если бы вы могли использовать точечную нотацию на отборочных сортировки, например:

[captainQuery orderByAscending:@"boat.name"]; 

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

// ... 
[captainQuery includeKey:@"boat"]; 
[query findObjectsInBackgroundWithBlock:^(NSArray *captains, NSError *error) { 
    NSArray *sortedCaptains = [captains sortedArrayUsingComparator: ^(PFObject *capA, PFObject *capB) { 
     return [capA[@"boat"][@"name"] compare:capB[@"boat"][@"name"]]; 
     // or reverse param order for descending 
    }]; 
}]; 

EDIT - @Logan услужливо указывает на то, что этот ответ не очень хорошо масштабируется, если ваши страницы запросов через тысячи капитанов. Если счет капитана огромен, лучше включить указатель капитана лодки и сделать следующее:

Более крутые, вы можете взять лодки, заказывать их на заказ, заказывать их капитаны (если ваши лодки иметь обратный указатель на капитана), а затем отобразить вернувшиеся (отсортированные) лодки для своих капитанов.

+0

Работает до слишком много объектов. Вы не хотели бы получать 10000+ объектов, когда все, что вам нужно, это имена лодок, начинающиеся с «a». Я думаю, что ваше предложение верных указателей является самым идеальным. Вам нужно будет настроить указатели двумя способами, но масштабируется намного лучше. – Logan

+1

@Logan - не уверен, что согласен. Вызов нескольких тысяч объектов будет проблемой, независимо от того, сортируете ли вы их локально. Моя идея обратной подсказки была бы плохой, если бы были 10-каратные лодки. Я думаю, нам нужно организовать наши запросы, чтобы вернуть разумный счет, несмотря ни на что. (parse принудительно применяет это с максимальным пределом = 1000). – danh

+0

Правильно, но, обратившись с лодок, вы не могли сделать пейджинг? Подобно запросу, отсортированному по имени boatName w/included key captain. Тогда вы можете просто получить 100 за раз и страницу по мере необходимости. В противном случае вам нужно будет достать все объекты капитана, чтобы они точно отсортировались на лодках. Это верно? – Logan

0

Вы можете использовать отношение запрос для нескольких запросов, код запроса должен выглядеть следующим образом:

PFObject *captain = [PFObject objectWithClassName:@"Captain"]; 
PFRelation *relation = [captain relationForKey:@"Boat"]; 
PFQuery *relQuery = [relation query]; 
[relQuery orderByDescending:@"name"]; 
// Add other query constraints 

[relQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (error) { 
     // There was an error 
    } else { 
     // All the captains sorted by related boat's names 
    } 
}]; 

Есть некоторые полезные ссылки ниже:

http://blog.parse.com/2012/05/17/new-many-to-many/ https://parse.com/docs/ios_guide#objects-pointers/iOS

0

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

Вы должны добавить третий стол - let'c называть его «капитан лодки», который содержит все лодки, которые содержатся в капитан-объекте. Вы поддерживаете его, добавляя лодку при добавлении нового капитана и удаляя его из таблицы при удалении капитана.

Чтобы отсортировать капитаны на своих лодках:

  1. запроса 'CaptainsBoats', отсортированные по любой другой. Обратите внимание, что даже если эта таблица содержит миллион записей, вы получите первый X, который вам подходит.
  2. Запрос «Капитаны», используйте метод «containsIn» с списком лодок с шага 1: [captainQuery whereKey:"boat" containedIn:boatList].

  3. Теперь у вас есть только объекты капитана, которые вам нужны (из возможного миллиона). Сортируйте их локально в соответствии с чем угодно.

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