0

定期的なイベントが発生するiphoneアプリケーションが1つあります。期間は、毎日、2日ごと、3日ごと、毎週月曜日、毎週火曜日、...、隔週月曜日などです。 、1srの毎月、2日の毎月...、1日の2か月ごと、2日の2か月ごと、...一部のイベントには終了日がありますが、一部のイベントは永久に発生します。 sqlite3 database.eg。イベントが3日ごとに繰り返される場合、3日後に自動的に保存するにはどうすればよいですか、または作成時にすべてのイベントを保存する必要があります。作成時にすべてのevnetを保存する場合、イベントは次のようになります。永遠に繰り返されます。データベースにそれらの値を保存する期間まで。

このために私は2つのアプローチを考えました.1つは毎日のように繰り返される期間で1つのオカレンスを保存していますが、私のアプリケーションでは編集および削除機能もあります。イベントに1つのフィールドイベントの説明があるとすると、ユーザーが日付ごとに異なる可能性がありますイベントを編集します。イベントは特定の月の画面に日付ごとに表示され、ユーザーは現在、次、および前の年の前月と翌月に移動できます。したがって、単一のオカレンスのみを使用する場合、編集または削除されたイベントはどこに保存する必要がありますか。そして、2番目のアプローチを取る場合は、各発生をデータベースに保存します。次に、終了日がないイベントをどの期間まで保存する必要がありますか。または、指定された期間の後に挿入が自動的に実行される方法があります。

4

1 に答える 1

3

2つの方法、1つは簡単なハック、もう1つは難しいが正しい:)

(1)個々のイベントを今後10年ほど(または必要な期間だけ)保存します。

良い:実装が簡単で迅速

悪い例:データベースはすぐに大きくなります。ユーザーが詳細を編集したい場合はどうしますか?すべてを一度に編集するにはどうすればよいですか?ユーザーがイベントをキャンセル/移動したい場合はどうなりますか?すべてを削除する必要があります!

(2)ある種の「イベントの再発」情報を、各イベント、つまり「毎週火曜日」とともにデータベースに保存します。

良い:繰り返し回数に関係なく、データベース内のイベントは1つだけです。ユーザーがイベントを編集/削除するのは簡単です-データベースには1行しかありません。

悪い例:より複雑なイベントオブジェクト-各イベントには、「このイベントが発生したとき」の情報のリストが必要です。非常に複雑なイベントのタイミングを難しくします-つまり、「毎月最終金曜日」の実装に時間がかかります


編集:私の個人的な選択

私はオプション(2)を選択します-実装には時間がかかりますが、オプション(1)は将来問題を引き起こすと思います。

私は次のようなデータモデルを持っているでしょう

Event has many Occurances

ここで、イベントはユーザーが説明や開始日などを使用して作成したものであり、オキュランスは「毎週金曜日」または「4日ではない」と表示されるオブジェクトの一種です。

イベントの作成の一環として、ユーザーは「13日の金曜日に1回発生する」または「毎週水曜日に発生する」と言います。その情報は、Occuranceオブジェクトの配列を作成するために使用されます。

オカレンスは、メソッドを単純に持つプロトコルであるoccursOn:ため、さまざまなタイプのオカレンスを使用できます(アプリが複雑になるにつれて、新しいタイプを追加できます)。

occursOn:Eventオブジェクトには、指定した場所のようなメソッドがありNSDate、その日に発生した場合は戻ります。これは、それぞれの発生を順番に尋ねて、それらがその日に適用されるかどうかを確認することによって行われます。

削除されたイベントを処理するには、イベントの配列の最後にオカレンスを追加して、他のイベントをオーバーライドします。つまり、「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

イベント「マイイベント」の場合、occursOnを実装します。

- (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は金曜日にのみ発生することを認識しているため、金曜日には「yes」を返し、「?」を返します。他のすべての日は、UIが金曜日に「マイイベント」を表示し、他の日は表示しないようにします。

さまざまな種類のオカレンスを追加するには<Occurance>、さまざまな方法でプロトコルを実装するだけです。

(3)

ユーザーは、実際には22日を除いて毎週金曜日にすべきだと言っています

アプリは別のオカレンス、今回は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 に答える