documentation on Android content providers描述了如何使用从getContentResolver()
获得的ContentResolver
来访问内容。
但是,也有一个可以从getContentResolver().acquireContentProviderClient(authority)
获得的ContentProviderClient
。它似乎提供了与ContentResolver
中提供的访问提供商内容的方法大致相同的方法。
什么时候应该使用ContentProviderClient
而不是直接使用ContentResolver
?有什么福利待遇?
发布于 2012-07-23 20:11:34
我认为另一个重要的区别是ContentProviderClient可以被转换到您的自定义提供者对象中,并访问除CRUD之外的其他方法。
ContentProvider cp = getContentResolver().acquireContentProviderClient(mCurUri).getLocalContentProvider();
yourProvider fld = (yourProvider)cp;
fld.query(...); // you can query as ContentResolver
fld.addFolder(newFolder); // also can invoke the extend method of your custom ContentProvider
发布于 2012-03-10 05:17:30
我发现了以下不同之处:我在app A中编写了自己的自定义内容提供程序。我在App B中编写了一个主屏幕小部件。当我试图通过我的小部件中的ContentResolver访问应用A的contentprovider时,我收到了一个“无法找到提供商信息”的错误。相反,当我通过ContentResolver获取ContentProviderClient并通过ContentProviderClient查询时,它就可以工作了。我不需要更改其他任何东西,只使用ContentProviderClient而不是ContentResolver。我对这种行为没有真正的解释,也没有在互联网上找到任何信息,为什么会这样。我不知道这是不是一个特殊的小部件,因为我没有在应用程序B的活动中尝试它(应用程序B只是一个小部件,没有活动)。
发布于 2016-04-08 21:32:04
ContentProviderClient的一个用法有助于在测试中访问ContentProvider的一些方法。例如,我在单元测试中使用shutdown()方法,以避免实例化多个内容提供者的多个测试。
像这样实现ContentProvider#shutdown()
:
@Override
public void shutdown() {
openHelper.close();
super.shutdown();
}
在测试方法的末尾,使用ContentProviderClient
调用shutdown()
来清理测试,以便其他测试可以使用内容提供者:
getContext()
.getContentResolver()
.acquireContentProviderClient(URI)
.getLocalContentProvider()
.shutdown();
https://stackoverflow.com/questions/5084896
复制相似问题