NSP предикат с NSDate и повторениями (как в приложении Календарь) - PullRequest
2 голосов
/ 19 августа 2010

У меня есть сущность "Event", которая содержит два свойства: date (NSDate) и repeat (NSInteger - 0 = NONE, 1 = DAILY, 2 = WEEKLY, 3 = MONTHLY, ...).

Кто-нибудь знает, как я могу отфильтровать события по повторам, передавая дату?

Пример:

Первое событие: 01-01-2010 / еженедельно
Второе событие: 10-02-2010 / ежемесячно
Текущая дата: 10-06-2010

Запрос:
Получить все события, где Event.date == «Текущая дата» ИЛИ Event.date.day == «Текущая дата» .day if Event.repeat == ежемесячно

Возвращенособытие:
Второе событие

Надеюсь, кто-то понимает, что я пытаюсь объяснить: s

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Проблема в том, что NSDate не имеет свойства day (или любого другого подобного). Если это так, ваш предикат будет работать как написано.

Программирование данных и времени обманчиво сложно. Например, в общем использовании фраза «та же дата» означает точно такой же календарный день. Однако с точки зрения кодов это также означает ту же неделю, месяц и год, потому что дни не более важны для кода, чем любое другое произвольное деление календаря. Даже при обычном использовании «день» может относиться к определенному диапазону часов, например Суббота, 21 августа 2010 года, или она может относиться к любому произвольному интервалу в 24 часа, например, «в течение дня». Какой вам нужен для этого приложения?

NSDate на самом деле является оберткой объекта с точностью до микросекунды. У него есть методы для преобразования в строки и для создания и сравнения временных меток, но он не понимает атрибуты календаря, такие как секунды, минуты, часы, дни, недели, месяц или годы. Именно для этого и предназначен NSCalendar, и Базовые Данные не поддерживают этот класс как тип данных, так как это делает все возможные календари слишком сложными.

Если в модели требуются атрибуты календаря, вам необходимо создать пользовательский объект, который моделирует дату календаря. Задайте для атрибутов сущностей атрибуты календаря, которые необходимо смоделировать, а затем установите связь с объектом, которому требуется календарная дата, в качестве свойства, например.

CalendarDate{
    date:NSDate
    minute:int
    hour:int
    day:int
    month:int
    year:int
    events<--(required,nullify)-->>Event.date
}

Вы можете создать собственный класс для сущности и предоставить метод, который автоматически заполняет объект на основе переданной NSDate и любого выбранного вами календаря.

Теперь ваш предикат прост.

NSPredicate *myPred;
myPred=[NSPredicate predicateWithFormat:@"(date.date==%@ or date.day==%i) AND repeat=%i", currentDate, 45, kMonthly]; 

Это кажется громоздким, но это требуется из-за истинной сложности календарных дат. Просто не существует простого способа обработки вычислений и сравнений даты и времени для всех целей.

0 голосов
/ 20 августа 2010

Я не уверен, что это можно сделать на уровне SQLite.Это, безусловно, может быть сделано, когда ваши события помещаются в память, но это, я подозреваю, побеждает вашу цель.

Возможно, существует какой-то умный способ для нормализации данных и, таким образом, создания ситуации, которую можно фильтровать.

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

Другая альтернатива, которую обычно используют календари, - это создание зависимых событий для определенных дат.Когда событие создается, вы создаете все зависимые события, так что вы просто фильтруете по дате.Противно, чтобы быть уверенным.

Последний вариант - вытащить все события в память и рассчитать оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...