2013-10-03 2 views
0

Я хотел бы выполнить NSFetchRequest. Я хочу просмотреть все объекты с определенным NSEntityDescription, но просто найдите текст в все поля.Я бы хотел найти записи CoreData, по многим полям

Я хотел бы сделать это, потому что я хочу иметь простое поле поиска в своем приложении. Поэтому, если пользователь вводит «Джо Цинциннати», они ожидают вернуть все записи, содержащие текст «Джо» и «Цинциннати», независимо от того, какие поля они появляются. Кроме того, запись должна иметь как «Джо», и «Цинциннати» в их областях где-то, это неважно, где.

+0

У вас есть проблема? Каковы результаты ваших исследований? –

ответ

1

Не проектируя специально для такого рода поиска, вы застряли либо с использованием сложных многочастных предикатов, либо с повторными выборками для покрытия каждой пары атрибутов поиска/строки. Для M условий поиска и N строковых атрибутов вы получаете либо один предикат с компонентами M x N, либо M x N отдельные выборки. Оба эти варианта сосут.

Но с некоторой предварительной работой вы можете обойти эту проблему. Вот несколько вариантов для рассмотрения:

Добавить новое поле «SearchText» к вашему лицу

Добавить новый атрибут строки в описании объекта называется searchText. Это поле составлено из всего текста из любого другого строкового атрибута, но в нормализованной форме (например, в нижнем регистре) в одном месте. В любое время, когда данные в другом строковом поле изменяются, вы обновляете searchText. При поиске вы используете этот атрибут. Ваш предикат имеет такое же количество компонентов, сколько количество поисковых запросов, которое должно быть намного быстрее.

В этом случае ваш предикат будет сложным предикатом И, где каждый термин имеет формат @"searchText contains %@".

Или ...

Добавить новый «SearchText» сущность

Создать новый тип объекта под названием SearchText, который имеет один строковый атрибут. Настройте отношения «один ко многим» вашего текущего типа сущности к новому типу SearchText. Каждый экземпляр вашего типа объекта будет относиться к одному экземпляру SearchText для каждого возможного условия поиска. Это по-прежнему требует предиката с несколькими частями, но поскольку текстовое поле намного короче, результаты должны быть намного быстрее.

В этом случае у вас все еще есть сложный предикат И, но в этом случае формат каждой части будет чем-то вроде @"any searchStrings = %@" (предполагая, что отношение new to-many называется searchStrings).

+0

Спасибо, Том. Думаю, я воспользуюсь частью 1 вашего ответа. Звучит хорошо и просто. –

0

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

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