两种方法,一种是简单的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 日,而是会出现在所有其他星期五。