如何从android内容提供商uri获取除片段(行号)之外的所有内容?

如何从android内容提供商uri获取除片段(行号)之外的所有内容?,android,uri,android-contentprovider,Android,Uri,Android Contentprovider,我想检索一个带有附加id的ContentURI,并能够去掉该id 换句话说,我有一个内容URI,例如: org.mycontentproviderAuthority/path1/path2/3 我想得到 org.mycontentproviderAuthority/path1/path2/ 是否可以最好使用Uri方法来实现这一点?我的意思是,我想我可以使用一个字符串标记器来删除最后一个数字,但是我假设一个uri api会更安全 我尝试了uri.getAuthority()+ur

我想检索一个带有附加id的ContentURI,并能够去掉该id

换句话说,我有一个内容URI,例如:

   org.mycontentproviderAuthority/path1/path2/3 
我想得到

   org.mycontentproviderAuthority/path1/path2/
是否可以最好使用Uri方法来实现这一点?我的意思是,我想我可以使用一个字符串标记器来删除最后一个数字,但是我假设一个uri api会更安全


我尝试了uri.getAuthority()+uri.getPath(),但这会返回整个ContentUri。

下面是一个从内容uri解析ID的示例

您可以使用以下选项:

static public Uri getUriWithoutLastNPathParts(final Uri uri, final int n) {
    final List<String> segments = uri.getPathSegments();
    final String[] newSegments = new String[segments.size() - n];

    final Uri.Builder builder = new Uri.Builder();
    builder.encodedAuthority(uri.getAuthority());
    builder.encodedPath(uri.getPath());
    builder.encodedQuery(uri.getQuery());

    // no "appendPath", it messes up the thing
    for (int i = 0; i < newSegments.length; i++) {
        newSegments[i] = segments.get(i);
    }
    builder.encodedPath(TextUtils.join("/", newSegments));

    return builder.build();
}

在我的例子中,我希望从URI中获取除(减去)id之外的所有内容。id将与URI.getPath()一起返回,因为id是路径的最后一部分。除了字符串操作之外,我不确定是否有任何方法可以让URI减去Id。我可能是错的,实际上我想知道是否会有一种“一个方法调用”的方法来实现它,但似乎没有。我猜它不存在的原因是,理论上,用户应该能够通过契约类复制URI(没有出现的ID)。无论如何,谢谢你的回答。
Uri uri = Uri.parse("org.mycontentproviderAuthority/path1/path2/3");
Log.i("Segments", uri + " " + getUriWithoutLastNPathParts(uri, 1));

uri = Uri.parse("org.mycontentproviderAuthority/path1/path2/3?foo=bar");
Log.i("Segments", uri + " " + getUriWithoutLastNPathParts(uri, 2));