我正在处理的代码列出了日历中的事件,我需要限制日期范围,在示例中我看到了这段代码:
// Construct the query with the desired date range.
Uri.Builder builder = Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(builder, startMillis);
ContentUris.appendId(builder, endMillis);
我不明白为什么以这种方式使用appendId。 startMillis和endMillis不是ids,我希望必须提供参数名称,例如“startdate”,我不清楚为什么这样做,以及可以用这种方式指定其他参数。 appenedId是否支持更多参数?我怎么知道?
答案 0 :(得分:2)
appendId实际上做的是向你的uri添加/#
,其中#是一个数字。在您的示例中(假设为startMillis = 1000
和endMillis = 3000
以及uri content://com.google.calendar/
),这意味着您的uri最终会像这样结束:
content://com.google.calendar/1000/3000
这是uri解析器可以拾取的东西:
URIMatcher.addURI(AUTHORITY, calendar + "/#/#", DATE_RANGE);
长话短说:appendId只是一种方便且类型安全的方法,可以在你的uri路径中添加一个整数。
答案 1 :(得分:0)
我也一直试图更多地了解ContentUris,因为我有一段代码在CalendarContract Instances表中没有工作。这很奇怪,因为我不需要为我开发的Calendars或Events表查询传递它们。
所以我添加了appendId语句,并以UTC的当前时间传递了这两个值,现在代码正常工作。我的代码中的实际查询是使用当前时间查找当前事件 - 请参阅下面的代码。如果我将appendID语句删除,则会引发异常 - 我认为它找不到Content Provider URL。
String instanceQuery = "EVENT_ID = " + event_id +
" AND begin <= " + now +
" AND end >= " + now;
Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI.buildUpon();
ContentUris.appendId(eventsUriBuilder, now);
ContentUris.appendId(eventsUriBuilder, now);
Uri eventsUri = eventsUriBuilder.build();
Cursor instanceCursor = null;
instanceCursor = ctx.getContentResolver().query(eventsUri,
new String[] { CalendarContract.Instances.EVENT_ID,
CalendarContract.Instances.BEGIN,
CalendarContract.Instances.END},
instanceQuery,
null,
null);
我的代码正在运行,但我想知道appendID语句实际上有什么影响,例如:这些值是否添加任何约束。看起来我的实际查询覆盖了传入的任何隐含范围,我真的不明白为什么需要它们。
希望得到更多理解这一点的人的简短解释会使开发者社区受益....