我使用以下方法获取日历的所有事件:
public Cursor getEventsCursor(Context context) {
long curr = System.currentTimeMillis();
long begin = curr - DateUtils.DAY_IN_MILLIS * 30; // - 30 days
long end = curr + DateUtils.DAY_IN_MILLIS * 30; // + 30 days
Cursor cur = null;
ContentResolver cr = context.getContentResolver();
String selection = Events.VISIBLE + "= ?";
String[] selectionArgs = new String[] {"1"};
String order = Events.DTSTART + " DESC";
Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, begin);
ContentUris.appendId(builder, end);
return cr.query(builder.build(), EVENT_PROJECTION,
selection, selectionArgs, order);
}
它有效,但我得到所有重复活动的初始时间!
日志
Feeder milestone; eventId: 12; date=2012-12-06 11:00:00 // initial time
Feeder milestone; eventId: 23; date=2012-12-06 11:00:00
Feeder milestone; eventId: 178; date=2012-12-06 11:00:00
Feeder milestone; eventId: 180; date=2012-12-06 11:00:00
如何获得重复发生的事件的实际时间?
示例:如果定期活动Feeder milestone
是每周两次的活动,我希望:
Feeder milestone; eventId: 12; date=2014-08-03 11:00:00
Feeder milestone; eventId: 23; date=2014-08-27 11:00:00
Feeder milestone; eventId: 178; date=2014-09-11 11:00:00
Feeder milestone; eventId: 180; date=2014-09-25 11:00:00
答案 0 :(得分:4)
从Calendar Provider documentation开始,有3件与Events
相关的内容,其中一件是Instances
。
事件:此表包含特定于事件的信息。此表格中的每一行都包含单个事件的信息 - 例如,事件标题,位置,开始时间,结束时间等。该事件可以一次发生或可以多次重复发生。与会者,提醒和扩展属性存储在单独的表中。它们每个都有一个EVENT_ID,它引用了Events表中的_ID。
实例:此表包含每次事件发生的开始和结束时间。此表中的每一行代表一个事件发生。对于一次性事件,实例与事件的映射为1:1。对于重复发生的事件,将自动生成多个行,这些行对应于该事件的多次出现。
(强调我的)
如果是重复发生的事件,Events.DTSTART
是指整个事件的开始时间。
另一方面,Instances.BEGIN
和Instances.END
是指事件每次出现的开始和结束时间。
一般情况下,请始终使用Instances.BEGIN
方便地获取所有事件的开始时间(无论是否重复)。