Android 什么是getContentResolver().call()以及如何使用它

Android 什么是getContentResolver().call()以及如何使用它,android,android-contentresolver,Android,Android Contentresolver,我已经阅读了Android上的文档 我还寻找了一个合适的例子,但毫无结果 根据文档,有一种方法call,当标准内容提供程序方法不足时,可以使用该方法访问自定义提供程序方法: final Bundle call(Uri uri, String method, String arg, Bundle extras) Call a provider-defined method. 因此,在我的代码中,我执行: getContentResolver().call(uri, method, arg

我已经阅读了Android上的文档

我还寻找了一个合适的例子,但毫无结果

根据文档,有一种方法
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
版本的
call()
不需要
Uri
参数,因为与
ContentResolver
不同,它不需要找到
ContentProvider
;它自己调用该方法

进一步的研究指出,冲突解决程序有一个uri参数,但没有等效的提供程序参数

他们就是这样写的。
Uri
只是用来识别
ContentProvider
——
ContentProvider
知道它是谁,因此不需要
Uri

提供程序方法不允许@Override注释

是的,正如您在以下内容中所看到的:

但是,您的构建目标(例如,在Eclipse中,Project>Properties>Android)必须设置为API级别11或更高

中相应的
call()
如下所示:

getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);
对。我在提供程序中有一个声明为“public”的方法,该方法被传递到contentresolver参数“method”中


这不是它的工作原理<在
ContentResolver上的code>call()
调用
ContentProvider上的
call()

您的
ContentProvider
是否有与
方法
字符串中的名称匹配的方法?是。我在提供程序中有一个声明为“public”的方法,它被传递到contentresolver参数“method”中。如果您提供一些(最少的)示例代码,它可能会帮助我们回答您的问题。Mea cupla。清理项目后,删除@override注释的请求神奇地消失了。依赖这种方法是一种好的做法吗?定义了call()方法的ContentProvider是否显示了正确的用法?@sandstar:“依赖此方法是一种良好的做法吗?”--如果您是
ContentProvider
的作者及其使用者,当然可以。“仅定义了call()方法的ContentProvider是否显示了正确的用法?”--IMHO,否。
call()
充其量是基本
ContentProvider
功能的附加组件。对于程序性工作,
ContentProvider
是无用的。谢谢您的解释!我认为这些方法是通过反射调用的。显然,在典型的面向对象模型中,使用ContentResolver/providers并不能强制执行契约。@AndroidAddict这是本文讨论的另一个问题。
getContentResolver().call(Provider.Constants.CONTENT_URI,
                          Provider.SET_KEY_METHOD, "sekrit", null);