Android UriMatcher 不匹配通配符

Android UriMatcher doesn't match wildcards

我有一个 ContentProvider,我需要匹配一些包含 UUIDs 作为通配符的 URIs

来自 ContentProvider 的 UriMatcher:

public static final Uri CONTENT_URI_NOTIFICATIONS = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_NOTIFICATIONS);
public static final Uri CONTENT_URI_USERS  = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH_USERS);

private static final int NOTIFICATIONS = 40;
private static final int USER_ID = 70;

private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

static
{
    sURIMatcher.addURI(AUTHORITY, BASE_PATH_NOTIFICATIONS, NOTIFICATIONS);
    sURIMatcher.addURI(AUTHORITY, BASE_PATH_USERS + "/*", USER_ID);
}

通知查询代码:

 Uri uri = Uri.parse(String.valueOf(MyContentProvider.CONTENT_URI_NOTIFICATIONS));
 return new CursorLoader(getActivity(), uri, projection, null, null, null);

USER_ID的查询代码:

String userId = "73279386-5459-4316-9ff9-7c6b7b84029a";
Uri uri = Uri.parse(MyContentProvider.CONTENT_URI_USERS + "/" + userId);
return new CursorLoader(getActivity(), uri, projection, null, null, null);

从上面的UriMatcher来看,NOTIFICATIONS URI匹配,但是USER_ID不匹配。知道这里有什么问题吗?值得注意的是,当我曾经使用整数而不是 UUID 来表示用户并且曾经在 UriMatcher 中使用 # 而不是 * 时,一切都按预期工作。切换到通配符后,匹配器停止匹配包含 UUID 的 URI。

显然,您添加 URI 的顺序很重要。如果您像下面这样设置,USER_DETAILS 将不再被识别。您必须调换顺序,先添加 USER_DETAILS。

sURIMatcher.addURI(AUTHORITY, BASE_PATH_USERS + "/*", USER_ID);
sURIMatcher.addURI(AUTHORITY, BASE_PATH_USERS + "/details", USER_DETAILS);