2015-04-28 8 views
0

У меня есть два стола один со списками и один с автомобилями.Parse - Получить объекты из отношений

В таблице List есть отношение к автомобилям. Таким образом, один список может содержать много автомобилей в столбце carsInList. Для столбца carsInList я использовал массив типов.

Каков наилучший запрос, чтобы получить все автомобили из одного списка? Должен ли я использовать уникальный ключ для одного списка и автомобилей в списке? Я думаю, что должен быть лучший способ, потому что в parse.com backend я вижу, что многие машины хранятся в столбце carsInList.

Спасибо за помощь!

ответ

2

Я предполагаю, что у каждого пользователя есть свой список автомобилей? Силой следующего метода является то, что он будет генерировать только 1 запрос API. Вам не обязательно использовать PFRelation.

Предположим, что у нас есть класс под названием «Список». Вы можете создать столбец с именем «userId» с объектом userId пользователя в качестве значения для запроса объекта списка.

PFObject* list = [PFObject [email protected]"List"]; 
PFUser* currentUser = [PFUser currentUser]; 
[list setObject:currentUser.objectId forKey:@"userId"]; 

Вы можете добавить один объект «Car» в качестве указателя на «Список» объект:

PFObject* car = [firstQuery getFirstObject]; // assuming the query has been created 
[list addObject:car forKey:@"cars"]; 
[list save]; 

или вы можете добавить несколько «автомобиль» объектов как указатели на «Список» объект :

NSArray* cars = [secondQuery findObjects]; // assuming the query has been created 
[list addObjectsFromArray:car forKey:@"cars"]; 
[list save]; 

Теперь запрос объекта следующим образом. Обязательно используйте метод includeKey:.

PFQuery* query = [PFQuery [email protected]"List"]; 
[query whereKey:@"userId" isEqualTo:currentUser.objectId]; 
[query includeKey:@"cars"]; // Make sure to include this when pulling an array of pointers 
PFObject* list = [query getFirstObject]; 
NSArray* cars = [list objectForKey:@"cars"]; 

Обратите внимание, что вы можете вытащить массив объектов «автомобиль» из «списка» объекта через includeKey : метод. Следует отметить, что addObject: ForKey: будет дополнять существующий массив. Вы можете добавить новый массив указателей к любому объекту с помощью метода setObject: ForKey: с помощью метода .

+0

Спасибо Майку Э. Это работает очень хорошо. Можете ли вы также рассказать мне, как вернуть этот запрос для метода - (PFQuery *) queryForTable в PFQueryTableViewControlle. Должен ли я делать это с двумя запросами? – user3678815

+0

Я никогда не использовал класс PFQueryTableViewController, но я бы предположил, что он работает так же, как и стандартный IOS UITableView. После того, как вы инициируете сеанс для пользователя, вы можете кэшировать данные пользователя через: ** PFUser * currentUser = [PFUser currentUser] **. После этого вам больше не нужно запрашивать текущего пользователя. Предполагая, что вы выполняете асинхронное извлечение данных, как только вы вытащили данные, вы можете просто обновить tableView внутри блока завершения. –

+0

Если этого ответа достаточно, вы должны принять его как принятое: -D –

1

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

PFQuery *query = [PFQuery queryWithClassName:@"List"]; 
// If you want to get a certain list, refine the query : 
[query whereKey:@"listId" equalTo:someListIdYouHaveLocally]; // or something. 

[query findObjectsInBackgroundWithBlock:^(NSArray *lists, NSError *error) { 
    // If your listId is unique, there should be only 1 list and this will 
    // only iterate 1 time. 
    for (PFObject *list in lists) 
    { 
     PFRelation *carRelation = [list relationForKey:@"Car"]; 
     PFQuery *query2 = [carRelation query]; 
     [query2 findObjectsInBackgroundWithBlock:^(NSArray *cars, NSError *error) { 

      for (PFObject *car in cars) 
      { 
       // Do whatever you want with that car. 
      } 
     }]; 
    } 
}]; 
+0

Благодарим за помощь. Мне нравится ваша функция. Я попробовал, но у меня проблема, что отношениеForKey всегда равно нулю. Должен ли я добавить что-то в массив автомобилей, когда я добавлю его в список? – user3678815

+0

Извините, я перечитываю ваш вопрос, и это будет работать только в том случае, если автомобили хранятся в каждом списке как «отношение». Ответ Майка Е должен работать на массивы. – Sam

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