Android之内容提供者ContentProvider的总结

时间:2023-03-08 17:44:01

本文包含以下知识点:

  ContentProvider
  Uri 的介绍
  ContentResolver:

  监听ContentProvider的数据改变


一:ContentProvider部分

ContentProvider的作用:

  Content providers store and retrieve data and make it accessible to all applications. They're the only way to share data across applications;

there's no common storage area that all Android packages can access.

  内容提供者作为一个应用程序共享其数据的唯一接口供其他的应用程序访问。比如我开发一个程序:想访问联系人,那么就必须通过联系人里的ContentProvider来获取数据。

  而如果别的应用程序想访问我的数据,必须看我个人的意愿,我意愿创建什么样的ContentProvider愿意共享出什么数据,别人才能看到这些数据。可以理解为我有意通 过

  ContentProvider来暴露我的数据。

ContentProvider的数据存储的形式:

  Content providers expose their data as a simple table on a database model, where each row is a record and each column is data of a particular type and meaning.

  以表格的形式暴露数据:

  For example, information about people and their phone numbers might be exposed as follows:

  Android之内容提供者ContentProvider的总结

  Every record includes a numeric _ID field that uniquely identifies the record within the table. 每一条记录都会有一个唯一的ID用于索引数据。

ContentProvider的创建:(注意创建完ContentProvider之后一定要在清单文件中进行配置)

  创建步骤如下:

  Android之内容提供者ContentProvider的总结

  那用中文解说就是:

    1.找到一个你喜欢的方式来存储数据。

    2.继承ContentProvider的类,注意:继承这个类的时候要重写以下六种方法来供调用:

    query() //查询数据,结果集以Cursor返回
    insert() //插入数据
    update() //更新数据
    delete() //删除数据。上面四个方法的第一个参数都要传入一个Uri对象。
    getType() 
    onCreate()

    3.在清单文件中进行配置://自己定义了一个ContentProvider一定要告诉别人不然人家怎么知道呢

      To let the Android system know about the content provider you've developed,

         declare it with a <provider> element in the application's AndroidManifest.xml file.

      Content providers that are not declared in the manifest are not visible to the Android system

      Android之内容提供者ContentProvider的总结

    配置时还有一个重要的参数:exported,表示该provider对象能否被其他程序访问,当然是true;

   注意:以上的配置是最为简单的配置,所有人只要知道了Provider的uri就能直接访问,实际可能需要加上permission权限来提高权限。

二:Uri部分:

  Uri是实现数据共享的桥梁是Android资源的唯一标识,相当于web中的URL一样。

public static final Uri CONTENT_URI = 
               Uri.parse("content://com.example.codelab.transportationprovider");
Android之内容提供者ContentProvider的总结

    


三:ContentResolver:

ContentProvider的获取和使用就要结合:ContentResolver和Uri来一起配合:
  forexample:在我的应用程序里调用联系人:

    ContentResolver cr = getContentResolver();

    //获取系统的resolver对象,注意此时并不知道要操作哪一个provider的数据。

    //需要一个uri参数在调用参数时与之匹配

    

      CONTENT_URI =Uri.parse("content://com.example.codelab.transportationprovider");

    cr可以调用增删改查的方法,通过Uri的参数实际上是调用对应ContentProvider的增删改查的方法。


四:内容观察者:ContentObserver:

  当数据共享出来之后,可以通过相关方法使得Provider里的数据发生改变,Android提供了内容观察者ContentObserver来监听其数据的改变。

  在实际使用时,我们需要继承ContentObserver的类并重写onChange()方法用于监听数据的改变。

  为了监听指定ContentProvider的数据改变,还需要通过ContentResolver向指定Uri注册内容观察者监听器:

  Android之内容提供者ContentProvider的总结

  参数介绍:1.uri指定ContentProvider。2.boolean值:假设:uri=content://abc,如果为true,则:content://abc/d数据改变就会触发监听,

        如果为flase:则不会触发。

        3自定义的ContentObserver.