2

我正在处理的代码列出了日历中的事件,我需要限制日期范围,在示例中我看到了这段代码:

// 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 不是 id,我希望必须提供参数名称,例如 "startdate" ,我不清楚这为什么有效,以及可以通过这种方式指定哪些其他参数。appendedId 是否支持更多参数?我怎么知道?

4

2 回答 2

3

appendId 实际所做的是将 a 添加/#到您的 uri 中,其中 # 是一个数字。在您的示例中(假设startMillis = 1000andendMillis = 3000和 uri content://com.google.calendar/),这意味着您的 uri 可能会像这样结束:

content://com.google.calendar/1000/3000

这是 uri 解析器可以拾取的东西:

URIMatcher.addURI(AUTHORITY, calendar + "/#/#", DATE_RANGE);

长话短说:appendId 只是一种方便且类型安全的方式,可以将整数添加到 uri 路径。

于 2012-12-09T18:43:45.417 回答
0

我也一直在尝试更多地了解 ContentUris,因为我有一段代码在 CalendarContract Instances 表中不起作用。这很奇怪,因为我不需要为我开发的日历或事件表查询传递这些信息。

因此,我添加了 appendId 语句,并以 UTC 格式为两个值传递了当前时间,代码现在可以工作了。我的代码中的实际查询是使用当前时间来查找当前事件 - 请参阅下面的代码。如果我取出 appendID 语句,则会引发异常 - 我认为它类似于找不到内容提供程序 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 语句实际上有什么影响,例如这些值是否添加了任何约束。看起来我的实际查询覆盖了传入的任何隐含范围,我真的不明白为什么需要它们。

希望更了解这一点的人的简短解释将使开发人员社区受益......

于 2013-08-21T06:22:09.777 回答