Возвращает дочерние элементы Realm RLMResults вместо при фильтрации

#ios #realm

#iOS #область

Вопрос:

Пример отношения Realm: People.Dogs.FavouriteFoods которые являются строго односторонними -> RLMArrays

У меня есть:

let result = RLMResult<People> из предыдущей операции.

и у меня есть массив FavoriteFood.Идентификаторы, выбранные пользователем

let selectedIDs: [String]

Теперь я пытаюсь отфильтровать / предикатировать этот результат, но вместо возврата People , который у меня уже есть, я пытаюсь получить объекты FavoriteFood, которые пересекаются с selectedIDs Я могу найти только руководства, которые объясняют, как сортировать / фильтровать, RLMResults<People> где результат People , т. Е. такой же, как общий тип в RLMResult.

Моя цель состоит в том, чтобы, в конце концов, создать список, в котором я могу сказать «Из 14 любимых продуктов, которые есть у собак человека А, 7 из них находятся в списке выбранных идентификаторов» и т.д. для пользователя B, C, D…

Я хочу что-то вроде: "ANY dogs.favouriteFoods.ID in selectedIDs" но он должен возвращать все любимые продукты, соответствующие предикату для отдельного человека, вместо всех людей, у которых есть собаки, имеющие эти конкретные любимые продукты.

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

Спасибо за любую предоставленную помощь.

Комментарии:

1. Не уверен, что я полностью понимаю вопрос, но позвольте мне задать это: предположим, у вас есть список любимых блюд, и одно из них — «печенье». Есть ли у вас в настоящее время способ запросить любимые блюда , чтобы вернуть собак, чье «печенье» является их любимым блюдом?

2. @Jay Нет, к сожалению, нет, я пытался выразить это, сказав, что отношения строго односторонние. Да, если бы существовали такие родительские отношения, было бы намного проще просто перебирать все продукты, которые соответствуют, а затем фильтровать сначала собаками, а затем людьми. Я подозреваю, что данные были экспортированы из другой базы данных в Realm и что все эти отношения должны быть сглажены :/

3. Ваше объяснение было хорошим, просто хотел убедиться. У вас есть несколько вариантов. Одна из возможностей заключается в том, что, поскольку вы знаете одностороннюю связь, загрузите все эти данные и создайте обратную связь. например, загрузите в person, а затем выполните итерацию по их списку dogs. Для каждой собаки вы знаете, что это любимая еда, поэтому добавьте свойство обратной связи к еде, а затем обновите его, чтобы указать обратно на собаку. Второй вариант — сгенерировать список объектов путем перебора вашего набора данных. Это довольно неэффективно, но было бы выполнимо. Сколько это данных? 100 объектов? 1 Млн объектов?

4. около 200 КБ, этого достаточно, чтобы оправдать небольшую осторожность при реализации. Обычно это не проблема с Realm, если я могу свести это к управляемому RLMResult, прежде чем начинать перебирать дочерние элементы и извлекать их в память. Но в этом случае я не вижу, как. Как только я начинаю вложение циклов, O (n) переходит в O (n в квадрате)