我有一个 ContentProvider
,我需要匹配一些包含 UUID
作为通配符的 URI
。
来自 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);
}
NOTIFICATIONS 的查询代码:
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);
关于Android UriMatcher 不匹配通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30446481/