#ios #parse-platform
#iOS #синтаксический анализ-платформа
Вопрос:
Допустим, у меня есть родительский класс, который имеет отношение «один ко многим» к дочернему классу целевого класса. Как родительский, так и дочерний объекты не создаются пользователем, я создаю эти объекты в браузере данных, и я не знаю, как установить связь или указатель на дочерний объект обратно на его конкретного родителя. Я могу получить дочерние объекты родительского объекта без проблем. Но как я могу получить родительский объект дочернего объекта? Я не хочу продолжать передавать как родительский, так и дочерний объекты из VC в VC. Еще раз, оба объекта НЕ созданы пользователем, поэтому я не могу сделать:
[Parent setObject:Child forKey:"child"];
а затем запросить родительский класс следующим образом:
[query whereKey:@"child" isEqualTo:Child];
Также запрос всех родителей и их отношений, а затем получение этого конкретного дочернего элемента и затем возврат к родительскому элементу кажутся излишними.
Итак, как я могу установить конкретного родителя для дочернего объекта в браузере данных, чтобы он указывал обратно на родителя? И как получить этот родительский объект из кода, если я хочу использовать только дочерний объект?
Ответ №1:
Это тот случай, когда использование обратного указателя может быть более полезным. Это можно сделать в дополнение к вашим существующим отношениям, если хотите, но для этого требуется более причудливая логика сохранения.
Просто добавьте parent
столбец к Child
, который имеет тип Pointer<Parent>
.
Чтобы получить все дочерние элементы родительского объекта, вы просто выполняете запрос:
[childQuery whereKey:@"parent" isEqualTo:parent];
Запросить дочерний объект, а также получить родительский:
[childQuery includeKey:@"parent"];
// filter as needed
В блоке, который выглядит дочерним, вы можете просто использовать:
PFObject *parent = child[@"parent"];
Он будет полностью заполнен Parent
из-за includeKey:
.
ПРИМЕЧАНИЕ: если вы сохраняете оба отношения, создание новых объектов становится сложнее, поскольку вам придется сохранить родительский / дочерний (с child.parent
unset), затем обновить дочерний объект, чтобы указать на родительский, и сохранить его снова.