Базовые данные: как сделать вторую выборку, ограниченную результатами предыдущей выборки? - PullRequest
1 голос
/ 04 мая 2011

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

В моем приложении я выполняю выборку и отображаю результаты. Затем, основываясь на пользовательском вводе, мне нужно отбросить эти результаты. То есть мне нужно выполнить новый поиск только по результатам первой выборки, но на основе совершенно другого параметра. (Иногда вторая выборка будет основываться на атрибуте, а иногда - на отношении ко многим.) Каков оптимальный способ сделать это?

Я нашел два варианта сделать это, но ни один из них не кажется очень хорошим:

  1. При первой выборке предварительно выберите все данные, необходимые для второй выборки. Затем не выполняйте второй выборки, а просто просматривайте массив результатов первой выборки, ища совпадения с новыми условиями второй выборки. Этот метод имеет недостаток, заключающийся в том, что я вынужден перебирать массив и не использовать преимущества производительности Core Data.

  2. Для второй выборки не обращайте внимания на первую и сделайте совершенно новую выборку с составным предикатом, состоящим из условий для первой выборки и условий для второй. Недостатком является то, что базовые данные должны снова просматривать всю базу данных, чтобы выполнить тот же поиск, что и раньше.

Есть ли способ, во второй выборке, сказать Core Data, что искать только через объекты сущностей, возвращенные в более ранней выборке?

1 Ответ

1 голос
/ 11 мая 2011

Вы в значительной степени поняли это.

Для первого варианта это довольно просто.У вас есть массив объектов, и вы можете просто сделать -[NSArray filteredArrayUsingPredicate:] или -[NSMutableArray filterUsingPredicate:], чтобы уменьшить массив в соответствии с вашими потребностями.Вам не нужно на самом деле перебирать массив самостоятельно;просто используйте предикат, как при запросе на выборку.

Для второго варианта это тоже довольно просто.Вы берете предикат из вашего первого запроса и AND его с вашим новым предикатом:

NSPredicate *original = ...;
NSPredicate *newCondition = ...;
NSPredicate *newFilter = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:original, newCondition, nil]];

Лично я обычно нахожу, что первый вариант в целом проще.

...