android.content.UriMatcher
如何使用它? 有人可以解释以下三行代码的含义吗?
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "cte", uriCode);
uriMatcher.addURI(PROVIDER_NAME, "cte/*", uriCode);
int res = uriMatcher.match(uri);
答案 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相关联的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没有涵盖这种情况,也不清楚此授权参数的作用是什么。 天哪,如果我知道这会节省我一些时间!