0

我有一个 iphone 应用程序,其中发生重复事件。持续时间就像每天,每 2 天,每 3 天 ..,每周星期一,每周星期二,...,每第二周星期一,.. ,每个月的 1sr,每个月的 2 日...,每个月的 1 日,每个月的 2 日,... 对于某些事件,有结束日期,但有些事件会永远发生。所以我怎样才能将它们自动插入sqlite3 数据库。例如。如果事件每 3 天重复一次。如何在 3 天后自动存储它。或者我应该在创建时存储所有事件。如果我在创建时存储所有事件网络,那么事件永远重复。直到我应该将它们的值存储在数据库中的持续时间。

为此,我认为有 2 种方法。一个只存储一个重复持续时间的事件,就像每天一样。但是在我的应用程序中,编辑和删除功能也存在。假设事件有一个字段事件描述,那么如果用户在不同的日期它可能会有所不同编辑事件。事件在特定月份的屏幕上按日期显示,用户可以导航到当前、下一个和前几年的任何上个月和下个月。因此,如果我只使用一次出现,那么应该将那些编辑或删除的事件存储在哪里. 如果我采用第二种方法将每个事件存储在数据库中。那么我应该将没有结束日期的事件存储到多长时间。或者有没有一种方法可以在指定的持续时间后自动执行插入。

4

1 回答 1

3

两种方法,一种是简单的hack,一种更困难但正确:)

(1) 将每个单独的事件存储在接下来的 10 年左右(或者你想多长时间!)

好:易于实施

坏:你的数据库会很快变大。如果用户想要编辑详细信息怎么办?如何一次编辑所有详细信息?如果用户想取消/移动事件怎么办——你必须删除所有事件!

(2) 将某种“事件重复”信息与每个事件一起存储在数据库中,即“每个星期二”

好:数据库中只有一个事件,无论它重复多少次。用户可以轻松编辑/删除事件 - 数据库中只有一行。

坏:更复杂的事件对象 - 每个事件都必须有一个“事件发生时间”信息列表。使非常复杂的事件计时变得困难 - 即“每个月的最后一个星期五”需要更长的时间来实施


编辑:我个人的选择

我会选择选项 (2) - 实施需要更长的时间,但我认为选项 (1) 将来会让您陷入麻烦。

我会有一个像这样的数据模型

Event has many Occurances

您的事件是用户创建的带有描述、开始日期等的东西,而发生是某种对象,会说“每个星期五”或“不在 4 日”。

作为创建事件的一部分,用户会说“在 13 号星期五发生一次”或“每周三发生一次”。该信息用于创建 Occurance 对象数组。

Occurance 将是一个协议,它只具有该方法occursOn:,因此您可以拥有许多不同类型的发生(并且您可以在您的应用程序变得更复杂时添加新类型)。

Event 对象将有一个类似于occursOn:你给它的方法NSDate,如果它在那天发生,它就会返回。它通过依次询问每个事件以查看它们是否适用于那天来做到这一点。

要处理已删除的事件,只需在 Event 数组的末尾添加一个覆盖其他事件的 Occurance - 即“不在 13 日星期五”。

例如 :

(1)

用户从 1 月 1 日开始创建一个名为“我的事件”的事件,该事件发生在每个星期五。

您的应用程序将存储

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

WeeklyOccurance 实现<Occurance>协议的地方

(2)

用户要求显示本周的事件,从 2011 年 1 月 8 日星期日开始

该应用程序将:

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 日,而是会出现在所有其他星期五。

于 2011-09-14T11:01:38.827 回答