【问题标题】:How to get everything except the fragment (row number) from an android content provider uri?如何从 android 内容提供程序 uri 中获取除片段(行号)之外的所有内容?
【发布时间】:2012-11-01 14:09:47
【问题描述】:

我想检索一个带有附加 id 的 ContentURI 并能够去除 id。

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

   org.mycontentproviderAuthority/path1/path2/3 

我想得到

   org.mycontentproviderAuthority/path1/path2/

是否可以最好使用 Uri 方法来做到这一点?我的意思是我想我可以使用字符串标记器来删除最后一个数字,但我假设为此使用 uri api 会更安全。

我尝试了 uri.getAuthority() + uri.getPath() 但这给了我整个 ContentUri。

【问题讨论】:

    标签: android uri android-contentprovider


    【解决方案1】:

    您可以使用以下内容:

    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 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));
    

    【讨论】:

    • 我实际上想知道是否会有“一个方法调用”的方式来做到这一点,但似乎没有。我猜它不存在的原因是因为理论上用户应该能够通过合同类重现 URI(没有附加的 ID)。无论如何感谢您的回答。
    【解决方案2】:

    【讨论】:

    • 在我的情况下,我想从 URI 中获取除(减去)id 之外的所有内容。
    • Id 将与 uri.getPath() 一起返回,因为 Id 构成路径的最后一部分。除了字符串操作之外,我不确定是否有任何方法可以让 URI 减去 Id。不过我可能是错的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多