了解使用ContentUris.appendId查询日历提供程序

时间:2012-10-10 23:30:44

标签: android android-contentprovider

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

// 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是否支持更多参数?我怎么知道?

2 个答案:

答案 0 :(得分:2)

appendId实际上做的是向你的uri添加/#,其中#是一个数字。在您的示例中(假设为startMillis = 1000endMillis = 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语句实际上有什么影响,例如:这些值是否添加任何约束。看起来我的实际查询覆盖了传入的任何隐含范围,我真的不明白为什么需要它们。

希望得到更多理解这一点的人的简短解释会使开发者社区受益....