getContentResolver().call()是什么,如何使用它?

4

我已经阅读了有关Android ContentResolver的文档。

我也搜索了一个合适的示例,但没有找到。

根据文档,有一个名为call的方法可以用作一种方式来访问自定义提供程序方法,当标准内容提供程序方法不足时使用:

final Bundle     call(Uri uri, String method, String arg, Bundle extras)
Call a provider-defined method.

所以在我的代码中我执行:

getContentResolver().call(uri, method, arg, extras);

但它总是返回 null bundle。实际上,提供程序 中的方法从未被调用。

进一步研究指向了一个(被认为的)合同差异,其中解析器具有没有等效提供程序参数的uri参数

Bundle   call(String method, String arg, Bundle extras)
Call a provider-defined method.

我显然没有理解某些东西。有人可以指导我正确的方向吗?


你的 ContentProvider 是否有一个与 method 字符串中的名称匹配的方法? - Code-Apprentice
是的。我在提供程序中有一个被声明为“public”的方法,它被传递到了contentresolver参数“method”中。 - Roy Hinkley
如果您提供一些(最少的)示例代码,那么这可能会帮助我们回答您的问题。 - Code-Apprentice
2个回答

6
进一步的研究指出,合同存在不一致之处,其中RESOLVER具有uri参数,而PROVIDER参数没有相应的等效项。
就是他们写的那样。Uri仅用于标识ContentProvider - ContentProvider知道自己是谁,因此不需要Uri。
提供程序方法不允许使用@Override注释。
是的,它可以,正如您在此示例ContentProvider中所看到的:this sample ContentProvider
  @Override
  public Bundle call(String method, String arg, Bundle extras) {
    if (SET_KEY_METHOD.equals(method) && arg != null) {
      key=arg;
    }

    return(null);
  }

然而,您的构建目标(例如,在 Eclipse 中,项目 > 属性 > Android)必须设置为 API 级别 11 或更高。 客户端 中相应的 call() 如下:
getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);

是的。我在提供程序中有一个声明为“public”的方法,该方法被传递到contentresolver参数“method”中。

这不是它的工作方式。ContentResolver上的call()调用了您的ContentProvider上的call()


我的错。在清理项目后,要求删除@override注释的请求神奇地消失了。 - Roy Hinkley
依赖于这种方法是一个好的实践吗?仅定义call()方法的ContentProvider是否显示正确的用法? - sandrstar
2
@sandrstar:“依赖这种方法是一个好的实践吗?”——如果您是ContentProvider的作者和使用者,那当然可以。 “仅定义call()方法的ContentProvider是否显示正确的用法?”——在我看来,不是。 call() 最多只是基本ContentProvider功能的附加功能。对于仅进行过程性工作的情况下,ContentProvider是无用的。 - CommonsWare
谢谢您的解释!我以为这些方法是通过反射调用的。 - WU Xudong

2
为了回答你的第二个问题,我猜测 call()ContentProvider 版本不需要一个 Uri 参数,因为它不像 ContentResolver 那样需要找到一个 ContentProvider,它会在自身上调用该方法。

显然,使用ContentResolvers/Providers不会在典型的面向对象模型中强制执行契约。 - Roy Hinkley
@AndroidAddict 这是另一个问题,不同于此处讨论的问题。 - Code-Apprentice

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