Как вставить вечно повторяющиеся события в базу данных sqlite3 iphone? - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть одно приложение для iphone, в котором происходят повторяющиеся события. Продолжительность - как каждый день, каждый 2-й день, каждый 3-й день ..., каждую неделю в понедельник, каждую неделю в понедельник, ..., каждую вторую неделю в понедельник , .., каждый месяц 1-го числа, каждый месяц 2-го ..., каждый второй месяц 1-го числа, каждый второй месяц 2-го числа, ... Для некоторых событий есть дата окончания, но некоторые события происходят вечно. их автоматически в sqlite3 database.eg. Если событие повторяется каждые 3 дня. Как я могу сохранить его автоматически через 3 дня. Или я должен сохранить все события во время создания. события, которые повторяются навсегда. до какой продолжительности я должен хранить их значение в базе данных.

Для этого я подумал, что 2 подхода. Один хранит только одно вхождение с повторяющейся длительностью, как каждый день. Но в моем приложении есть также функция редактирования и удаления. Предположим, что у события есть одно описание события поля, тогда оно может быть различным для разных даты, если пользователь редактирует события. События отображаются на экране по дате для определенного месяца, и пользователь может перейти к любому предыдущему и следующему месяцу для текущего, следующего и предыдущего лет. Так что, если я использую только одно вхождение, то где должны быть отредактированные или удаленные события должны быть сохранены. И если я воспользуюсь вторым подходом, сохраните каждое вхождение в базе данных. Затем, до какой продолжительности я должен хранить события, у которых нет enddate.or, или есть способ, которым вставка выполняется автоматически после указанной продолжительности.

1 Ответ

3 голосов
/ 14 сентября 2011

Два способа, один легкий взлом, другой более сложный, но правильный:)

(1) Сохранять каждое отдельное событие в течение следующих 10 лет или около того (или сколь угодно долго!)

Хорошо: легко и быстро реализовать

Плохо: ваш БД очень быстро увеличится.Что, если пользователь хочет редактировать детали - как вы редактируете все сразу?Что делать, если пользователь хочет отменить / переместить событие - вы должны удалить их все!

(2) Сохранять некоторую информацию о «повторении события» в базе данных для каждого события, то есть «Каждый вторник»

Хорошо: только одно событие в базе данных, независимо от того, сколько раз оно повторяется.Пользователь может легко редактировать / удалять событие - в базе данных есть только одна строка.

Плохо: более сложный объект события - у каждого события должен быть список информации «когда это событие происходит».Трудно усложняет синхронизацию событий - например, «последняя пятница каждого месяца». Реализация занимает больше времени


РЕДАКТИРОВАТЬ: Мой личный выбор

Я бы выбрал вариант (2) - это займет больше времениреализовать, но я думаю, что вариант (1) вызовет у вас проблемы в будущем.

У меня будет модель данных, такая как

Event has many Occurances

, где ваше событието, что пользователь создал с описанием, датой начала и т. д. и Occurance, является своего рода объектом, который будет говорить «каждую пятницу» или «не 4-го числа».

Как часть создания события,пользователь скажет «происходит один раз в пятницу 13-го» или «происходит каждую среду».Эта информация используется для создания массива объектов Occurance.

Occurance - это протокол, который просто имеет метод occursOn:, поэтому вы можете иметь множество различных типов вхождения (и вы можете добавлять новые типы в качествеприложение становится более сложным).

Объект Event будет иметь метод, похожий на occursOn:, где вы даете ему NSDate, и он возвращается, если это произойдет в тот день.Он делает это, спрашивая каждое из его вхождений по очереди, чтобы посмотреть, относятся ли они к тому дню.

Чтобы иметь дело с удаленными событиями, просто добавьте Occurance в конец массива события, который переопределяет другие - т.е.не в пятницу 13-го '.

Например:

(1)

Пользователь создает событие под названием «Мое событие», которое начинается 1 января и происходит каждую пятницу.

Ваше приложение будет хранить

Event
    description : 'My Event',
    start date : 1st Jan 2011
    occurances :
        WeeklyOccurance
            day : Friday

, где WeeklyOccurance реализует протокол <Occurance>

(2)

Пользователь просит показать события недели,начиная с воскресенья 8 января 2011 года

Приложение будет:

For each day in the week
    For each event in the database
        if occursOn: this day
            show the event on the ui

, а для нашего события «Мое событие» оно будет реализовано на: вроде

- (BOOL)occursOn:(NSDate *)date

    is this date before this event starts
        if it is, return NO

    set remembered = NO
    for each occurance
       does this occurance say 'yes','no' or '?' for this date?

       if 'yes' set remembered YES
       if 'no' return NO

       if '?' continue the loop

   return remembered

Поскольку WeeklyOccurace знает только, что это происходит по пятницам, он будет возвращать «да» по пятницам и «?»во все остальные дни пользователь отображал «Мое событие» в пятницу, а не в другие дни.

Чтобы добавить разные типы событий, просто реализуйте протокол <Occurance> по-разному.

(3)

Пользователь говорит, что на самом деле он должен быть каждую пятницу, кроме 22-го

Приложение создаст еще одно Occurance, на этот раз NotOnThisDayOccurance и добавит его в конецМассив события, т. Е.

Event
    description : 'My Event',
    start date : 1st Jan 2011
    occurances :
        WeeklyOccurance
            day : Friday
        NotOnThisDayOccurance
            day: 22nd Jan 2011

Теперь, если пользователи попросят отобразить еженедельные события, «Мое событие» будет выглядеть так:

Ask the WeeklyOccurance if it's valid for friday the 22nd - this would return yes.
Ask the NotOnThisDayOccurance if it's valid for friday the 22nd - this would override the previous result and say NO

Следовательно, событие не будет отображаться22-го числа, но он появится во все остальные пятницы.

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