4

CalendarContract.Events DTEND 列を更新しても、CalendarContract.Instances END 列に変更が表示されないのはなぜですか?

私のアプリでは、CalendarContract.Events API を使用して、ユーザーがカレンダー イベントを表示および変更できます。このコードは、Events テーブルの更新を実行してから、(後で) Instances テーブルを使用してそれを読み取ります。たとえば、TITLE への変更は正常に機能します (つまり、イベントを更新し、インスタンスの変更を読み取ることができます)。Events.DTEND への変更は Instances.DTEND に表示されますが、その更新を Instances.END にも表示するにはどうすればよいですか?

明らかに、Android カレンダー アプリ (および私のアプリも) は Instances.BEGIN と Instances.END を使用してカレンダーに表示するものを決定するため、これは重要です。

これが私の更新コードです:

  ContentResolver cr = getContentResolver();
  ContentValues values = new ContentValues();
  values.put (Events.CALENDAR_ID, calendarId);
  values.put (Events.TITLE, title);
  values.put (Events.DTEND, eventEnd.getTimeInMillis());
  String where = "_id =" + eventId +
                 " and " + CALENDAR_ID + "=" + calendarId;
  int count = cr.update (Events.CONTENT_URI, values, where, null);
  if (count != 1)
     throw new IllegalStateException ("more than one row updated");

ありがとう。

4

1 に答える 1

2

解決策は、開始日を追加することです。

  ContentResolver cr = getContentResolver();
  ContentValues values = new ContentValues();
  values.put (Events.CALENDAR_ID, calendarId);
  values.put (Events.TITLE, title);
  values.put (Events.DTSTART, eventStart.getTimeInMillis());
  values.put (Events.DTEND, eventEnd.getTimeInMillis());
  String where = "_id =" + eventId +
                 " and " + CALENDAR_ID + "=" + calendarId;
  int count = cr.update (Events.CONTENT_URI, values, where, null);
  if (count != 1)
     throw new IllegalStateException ("more than one row updated");

注意: このケースでは、非定期的なイベントを更新する方法のみを示しています。非定期的なイベントの RRULE は null です。

プロバイダーコードが行っていることは、開始日自体を再取得するのではなく、提供した値のみを使用していると思われます (明らかに、ユーザーが開始日を変更した場合はとにかく提供する必要があります)。これは、データベースへのアクセスを減らすという観点からは理にかなっています。残念なことに、Google はこれを文書化しませんでした。

于 2012-12-09T17:53:12.920 に答える