11

Android の新しいカレンダー API を使用して、今日のすべてのカレンダー イベントを読み取ろうとしています。データベース クエリですべてのイベントを返すための適切な選択を見つけるのに苦労しています。すべての定期的なイベントと終日のイベントが選択から除外されているようです。カレンダー API から今日のすべてのイベントを取得するには、どの選択引数を使用すればよいでしょうか?

これが私の現在の試みです:

    Cursor cur = null;
    String selection = "((" + CalendarContract.Events.DTSTART
            + " >= ?) AND (" + CalendarContract.Events.DTEND + " <= ?))";
    Time t = new Time();
    t.setToNow();
    String dtStart = Long.toString(t.toMillis(false));
    t.set(59, 59, 23, t.monthDay, t.month, t.year);
    String dtEnd = Long.toString(t.toMillis(false));
    String[] selectionArgs = new String[] { dtStart, dtEnd };
    cur = c.getContentResolver().query(CalendarContract.Events.CONTENT_URI,
            null, selection, selectionArgs, null);

定期的なイベントと終日のイベントを取得するために、選択範囲を広げたり追加したりする方法がわかりません。どんな助けでも大歓迎です。

4

5 に答える 5

21

定期的なイベントを含む、今日のすべてのイベントを取得するには、インスタンス テーブルを使用する必要があります。

Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI
            .buildUpon();
ContentUris.appendId(eventsUriBuilder, timeNow);
ContentUris.appendId(eventsUriBuilder, endOfToday);
Uri eventsUri = eventsUriBuilder.build();
Cursor cursor = null;       
cursor = mContext.getContentResolver().query(eventsUri, columns, null, null, CalendarContract.Instances.DTSTART + " ASC");

イベント URI に時間制約を追加する必要があることに注意してください。他の方法で並べ替えることはできません。

終日のイベントも含めるには、前夜の午後 11 時 59 分と今夜の午前 0 時まで検索を拡張します。

于 2012-10-26T01:13:37.867 に答える
5

Your conditions only give you the events that are strictly in today limits. You should check the ones that start before today and end after (multidays event).

For recurring events, I check them manually. I don't found another way.

I use something like:

String selection = "((" + CalendarContract.Events.DTSTART + " <= ?) AND (" + CalendarContract.Events.DTEND + " >= ?)) OR (" + CalendarContract.Events.RRULE + " is not null )";

String[] selectionArgs = new String[] { dtEnd, dtStart};

Regards,

于 2012-09-09T16:34:11.617 に答える
2

CalendarContract.Events.ALL_DAY を選択条件に追加して、すべての ALL_DAY イベントをフィルタリングできるはずです。

于 2012-05-05T20:37:42.130 に答える
2

これが少し遅れていることは承知していますが、非常によく似た質問があり、探している答えを見つけるのに苦労しました. 終日イベントの強制 UTC タイム ゾーンにより、処理が複雑になりました。これが私の解決策です:

    // "allDayStart" is an all-day event today, encoded in the default time zone
    Time allDayStart = new Time();
    allDayStart.timezone=TimeZone.getDefault().toString();
    allDayStart.set(dayStart.monthDay, dayStart.month, dayStart.year);

    // 2 time selections for the query: 
        // 1) Between day-start and day-end (not all-day); or
        // 2) Equals today at 0:00:00 (all-day) in the default timezone
    String calSelection = 
        "((" + Calendars.ACCOUNT_NAME + " = ?) " +
            "AND (" + Calendars.OWNER_ACCOUNT + "= ?) " +
            "AND (" +
                "((" + Events.DTSTART + ">= ?) " +
                "AND (" + Events.DTSTART + "<= ?) " +
                "AND (" + Events.ALL_DAY + "= ?) " +
                ") " +
            "OR ((" + Events.DTSTART + "= ?) " +
                "AND (" + Events.ALL_DAY + "= ?)" +
                ")" +
            ")" +
        ")"; 

    String[] calSelectionArgs = new String[] {
        accountName, ownerName, 
        dayStartInMillis.toString(), dayEndInMillis.toString(), "0", // during today, not all day
        allDayStartInMillis.toString(), "1" // Started today at default start-time for all-day events (all-day), default time zone
    }; 

クエリは 2 つの部分を必要としないように調整できますが、これで十分でした。

参考までに、dayStart と dayEnd の由来は次のとおりです。

    Time dayStart = new Time();
    dayStart.setToNow();
    dayStart.hour=0;
    dayStart.minute=0;
    dayStart.second=0;

    Time dayEnd = new Time();
    dayEnd.set(dayStart);
    dayEnd.hour=dayStart.hour+23;
    dayEnd.minute=dayStart.minute+59;
    dayEnd.second=dayStart.second+59;

    Long dayStartInMillis = dayStart.toMillis(false);
    Long dayEndInMillis = dayEnd.toMillis(false) + 999;
    Long allDayStartInMillis = allDayStart.toMillis(false);
于 2013-09-18T04:58:17.863 に答える