ContentProvider

部分转载自:ConntentProvider 从入门到精通

ContentProvider的角色

ContentProvider 一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。
之所以使用ContentProvider,主要有以下几个理由:

  1. ContentProvider提供了对底层数据存储方式的抽象。底层使用了SQLite数据库,在用了ContentProvider封装后,即使你把数据库换成MongoDB,也不会对上层数据使用层代码产生影响。

  2. Android框架中的一些类需要ContentProvider类型数据。如果你想让你的数据可以使用在如SyncAdapter,Loader,CursorAdapter等类上,那么你就需要为你的数据做一层ContentProvider封装。

  3. 第三个原因也是最主要的原因,是ContentProvider为应用间的数据交互提供了一个安全的环境。它准许你把自己的应用数据根据需求开放给其他应用进行增、删、改、查,而不用担心直接开放数据库权限而带来的安全问题。

ContentResolver

ContentProvider

有些人可能会疑惑,为什么我们不直接访问Provider,而是又在上面加了一层ContentResolver来进行对其的操作,这样岂不是更复杂了吗?其实不然,大家要知道一台手机中可不是只有一个Provider内容,它可能安装了很多含有Provider的应用,比如联系人应用,日历应用,字典应用等等。有如此多的Provider,如果你开发一款应用要使用其中多个,如果让你去了解每个ContentProvider的不同实现,岂不是要头都大了。所以Android为我们提供了ContentResolver来统一管理与不同ContentProvider间的操作。

那ContentResolver是如何来区别不同的ContentProvider的呢?这就涉及到URI(Uniform Resource Identifier)问题。
ContentProvider 中的URI 有固定的格式:

  • Authority:授权信息,用以区别不同的ContentProvider;
  • Path:表名,用以区分ContentProvider中不同的数据表;
  • Id:Id号,用以区别表中的不同数据;