android.content.UriMatcher的含义是什么?

17

什么是 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个回答

40

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

myprovider://cte
或者
myprovider://cte/somestring

构建UriMatcher时,您需要为每个URI拥有单独的代码(不只是像示例中的“uriCode”那样)。我通常将UriMatcher实例设置为静态,并在静态构造函数中添加URIs:

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
我通常将我的UriMatcher实例设置为静态的,为什么呢? - Marian Paździoch
2
@MarianPaździoch 静态块在任何对象创建之前调用,当类被加载时就会被调用。这使得URI匹配器在加载类时准备好工作。 - W00di

5
我发现以下视频很有用:

URI基础知识

URI匹配器

实质上,你所要做的是将ID或编号与不同的URI相关联。当您使用addUri时,会针对URI创建一个代码/编号/ID。当您请求一个match()时,会返回相应的代码。

2

我想要补充一件事,第一次使用UriMatcher时对我来说不是很清楚。

如果你想解析一个HTTP URL,那么在addURI中作为AUTHORITY参数需要传递目标域名。例如:

Uri mUri = Uri.parse("http://example.com/foo");
UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// if not "example.com" below the match will always return -1 result
sURIMatcher.addURI("example.com", "/foo", 123);

int match = sURIMatcher.match(mUri);

UriMatcher文档没有涵盖这种情况,也不清楚这个authority参数是什么。 天哪,如果我知道这个能省些时间!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接