Получение данных со сложными критериями

Мое приложение имеет относительно простую модель (унаследованную от существующей модели веб-сайта).

Одним из атрибутов модели является date. К сожалению, значения этого атрибута имеют произвольную форму и тип String. Я имею в виду, что значения такие:

  • «Июнь 1888 года, Арль»
  • "c. 1530"
  • "1634-37"
  • "1508"

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

В настоящее время я использую простой подход:

NSString *format = @"date contains[cd] %i";
NSPredicate *predicate = [NSPredicate predicateWithFormat:format, year];

но это не позволяет мне найти все между двумя заданными датами.


person Bobrovsky    schedule 01.07.2013    source источник


Ответы (2)


У вас... может быть проблема. Любую дату можно преобразовать в целочисленное значение, и NSDateFormatter отлично справляется с анализом дат, если вы знаете, какой формат использовать. Похоже, у вас есть несколько очень разных форматов, поэтому вам не удастся обойтись простым преобразованием или поиском, чтобы получить целочисленные значения для ваших строк даты.

Было бы довольно легко найти только четырехзначный год, но ваш пример «1634-37» как бы сносит эту идею. Если вы искали 1636, он должен совпасть, но без дополнительной помощи. Если вы можете принять определенную погрешность, вам может быть все равно — просто позвоните по номеру 1634 и покончим с этим. Если нет, во-первых, вам понадобится диапазон дат (минимум 1634, максимум 1637), а не одна дата, а во-вторых, вам понадобится какой-то способ понять, что «-37» следует применять к «16». . Удачи с этим, потому что это быстро становится сложной проблемой.

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

Отдельно стоит отметить, что если бы это был я, я бы хотел преобразовать их в числовые значения при получении данных с веб-сервера. Тогда при выполнении выборки я смогу использовать числовое сопоставление в предикате для быстрых результатов. Сопоставление строк, особенно если вам нужно использовать регулярное выражение, выполняется очень медленно по сравнению с числовыми сравнениями.

person Tom Harrington    schedule 01.07.2013
comment
Спасибо, я думаю, что вы правы, и было бы лучше заранее преобразовать значения. В конце концов, данные редко меняются, и я могу допустить некоторые неточности, такие как трактовка 1634-37 как 1634. - person Bobrovsky; 02.07.2013

Объедините NSPredicate с регулярными выражениями. Вот ссылка. Используйте регулярное выражение для поиска 4-значного числа NSPredicate и Regex

person William Falcon    schedule 01.07.2013
comment
Спасибо. Здорово, что есть такая возможность, но я бы лучше воздержался от регулярных выражений :-) В любом случае, еще раз спасибо. - person Bobrovsky; 02.07.2013