android.content.UriMatcher的含义

时间:2014-11-13 04:59:25

标签: java android uri

android.content.UriMatcher

中的Uri Matcher是什么?

如何使用它? 有人可以解释以下三行代码的含义吗?

  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  uriMatcher.addURI(PROVIDER_NAME, "cte", uriCode);
  uriMatcher.addURI(PROVIDER_NAME, "cte/*", uriCode);
  int res = uriMatcher.match(uri);

3 个答案:

答案 0 :(得分:36)

当您编写ContentProvider或其他需要响应许多不同URI的类时,UriMatcher是一个方便的类。在您的示例中,用户可以使用URI查询您的提供程序,例如:

myprovider://cte

myprovider://cte/somestring

构建UriMatcher时,您需要为每个URI分别设置代码(不仅仅是" uriCode"如您的示例所示)。我通常将我的UriMatcher实例设为静态,并在静态构造函数中添加URI:

private static final int CTE_ALL = 1;
private static final int CTE_FIND = 2;
private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
    uriMatcher.addURI(PROVIDER_NAME, "cte", CTE_ALL);
    uriMatcher.addURI(PROVIDER_NAME, "cte/*", CTE_FIND);
}

然后在您的ContentProvider中,您将在查询方法中执行以下操作:

Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    int res = uriMatcher.match(uri);
    switch (res) {
        case CTE_ALL:
            //TODO create a results Cursor with all the CTE results
            break;
        case CTE_FIND:
            //TODO create a results Cursor with the single CTE requested
            break;
    }
    return results;
}

答案 1 :(得分:5)

我发现以下视频很有用:

URI Basics

URI Matcher

从本质上讲,您要做的是拥有与不同URI相关联的ID或数字。使用addUri时,会根据URI创建代码/编号/ ID。当您请求匹配()时,将返回相应的代码。

答案 2 :(得分:1)

我想补充的一件事对于我第一次使用UriMatcher还是不清楚的。

如果要解析HTTP URL,然后将其作为 addURI 中的 AUTHORITY 参数,则需要传递目标域名。例如:

    @Bean
    public AsyncItemWriter<Employee> asyncItemWriter() throws Exception{
        AsyncItemWriter<Employee> asyncItemWriter = new AsyncItemWriter<>();
        // Delegate to EmployeeWriter
        asyncItemWriter.setDelegate(EmployeeWriter());
        asyncItemWriter.afterPropertiesSet();
        return asyncItemWriter;  
    }

    @Bean
    public Step EmployeeStepOne() {
        return stepBuilderFactory.get("EmployeeStepOne")
                .<Employee, Employee>chunk(Integer.parseInt(chunkSize))
                .reader(EmployeeReader)
                .processor((ItemProcessor)asyncItemProcessor)
                // Change the writer here
                .writer(asyncItemWriter())
                .build();
    }

UriMatcher Documentation没有涵盖这种情况,也不清楚此授权参数的作用是什么。 天哪,如果我知道这会节省我一些时间!