ContentProvider

来源:互联网 发布:淘宝买家故意说发错货 编辑:程序博客网 时间:2024/05/16 05:25
  1. 内容提供者
    1. 分为系统提供的内容提供者和自定义的内容提供者
    2. 系统的内容提供者:一般在数据库下/data/data/下以com.android.provider开头的包名,都是有系统内容提供者的,比如短信,联系人等。获得联系人信息,短信等都是利用系统的内容提供者。
    3. 自定义的内容提供者:比如我在A工程下建立了一个数据库,那么在B工程下如何对A工程下的数据库进行操作?因为A工程下数据库是private的,外界无法直接操作,这时,如果在A工程下建立一个内容提供者,那么B工程就可以通过A工程下的内容提供者对A的数据库进行操作,在这里A下的内容提供者就是自定义的内容提供者。
  2. 自定义内容提供者:是主动向外界提供信息的组件
    1. 创建一个自定义内容提供者,需要继承类:ContentProvider
      1. 如:public class PersonDBProvider extends ContentProvider
    2. 在清单文件中注册:
      1. <provider  
      2. android:name:内容提供者的全类名,其实就是:包名.内容提供者类名
      3. android:authorities:代表主机名,中间人的联系方式,可以自定义,写什么都行,不过一般都写  :包名.内容提供者类名
      4. android:permisission:权限,如果不加权限那么任何人都可以通过这个内容提供者进行操作。现在学习阶段,可以不加。
      5. ></provider>
    3. 在自定义的内容提供者中,暴露出来了对数据库的CRUD方法。共用的参数Uri,代表一个路径,一个地址,一个特殊的电话,一个暗号。如果某人拨打了一个特殊的电话,并且该电话与我们内容提供者的特殊电话对接上了(uri),那么我们就为这个人服务。并且只有当你的Uri与我内容提供者和的Uri能够对接时,我内容提供者才会为你服务。在CRUD的方法中都有uri参数,也就是说,当你提供的Uri与我CRUD的Uri向符合,那么我这个CRUD的方法可以为你服务。如果发现你的Uri与我CRUD中的Uri不一致,我内容提供者就不为你服务。内容提供者的服务都是基于这个Uri的,会根据不同的Uri进行不同的服务。CRUD的各自uri是不同的,这样匹配上各自的uri,各自都会为你去服务。
    4. authorities的意义:就相当于javaweb中的域名,tieba.baidu.com     tupian.baidu.com   不同的路径不同的主机名对应不同的界面。而内容提供者:authorities +代表功能的字符串。比如:
      1. authorities :com.example.a0301_sqlite.provider.PersonContentProvider
      2. 代表删除操作的uri可以是:authorities+/person/delete    也就是:com.example.a0301_sqlite.provider.PersonContentProvider/person/delete
      3. 代表插入操作的uri可以是:authorities+/person/insert    也就是:com.example.a0301_sqlite.provider.PersonContentProvider/person/insert
      4. 代表修改操作的uri可以是:authorities+/person/update    也就是:com.example.a0301_sqlite.provider.PersonContentProvider/person/update
      5. 等等等等。。。。。总的来说就是在authorities后跟上功能字符串,以组成各自功能对应的uri。不过authorities一旦自定义了,必须是固定的。注意后面第6条。
    5. 网站的路径:http://
    6. 内容提供者的约定俗成的路径一般是:content://
    7. uri的终极组成:内容提供者路径+authorities+功能字符串
    8. 比如插入操作:uri可以是: content://com.example.a0301_sqlite.provider.PersonContentProvider/person/insert
    9. 上面的uri 就可以理解为一些自定义的路径规则
    10. 为了识别这些规则,我们必须匹配解析这些路径,需要用到系统提供的UriMatcher  工具类,主要功能就是匹配uri。
      1. 匹配器:在创建UriMatcher实例时:UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);这里的UriMatcher.NO_MATCH,表示当匹配的Uri都不符合条件时返回该UriMatcher.NO_MATCH,其实就是-1.
      2. 增加一些匹配规则:uriMatcher.addURI(authority,path,code)。意思是说,我增加一个匹配规则,authority 和path如果能匹配上,那么就返回我指定的这个code。这里的code通常是一个数字,一般用大写字母的常量来表示。比如:
        1. 定义指定的code常量:private static final int INSERT =1;
        2. uriMatcher.addURI("com.example.a0301_sqlite.provider.PersonContentProvider","person/insert",INSERT);  这里参数对应的就是:authority  ,path  ,code。。。。。。而code又用常量INSERT来代替了。
    11. 当内容提供者所在工程被部署到模拟器上时,会在系统的logcat中打印信息:
      1. Tag:   ActivityThread
      2. Text:  Pub com.example.a0301_sqlite.provider.PersonContentProvider:com.example.a0301_sqlite.provider.PersonContentProvider
        1. Pub: 发布的意思,publish,表示发布一个内容提供者,通俗的说就是,这个程序有个后门
        2. com.example.a0301_sqlite.provider.PersonContentProvider:这是authority,主机名
        3. com.example.a0301_sqlite.provider.PersonContentProvider:这是内容提供者类的全路径
    12. 内容解析者:ContentResolver。这个内容解析者相当于一个中间人,它会去用第三方提供的uri匹配内容提供者的uri,如果匹配成功就会调用内容提供者的相关方法。

    13. long id = ContentUris.parseId(uri);这个方法的作用是可以拿到Uri后面追加的id。比如自定义内容提供者的insert方法,返回值就是一个Uri,通常在方法内返回的值是:return ContentUris.withAppendedId(uri, id)   ,其中uri 是进行插入操作的Uri   而id是插入后所影响到的行的id
  3. 访问系统的内容提供者,监听系统短信变化
    1. 首先系统的内容提供者已经内置好了,我们不需要再写。现在我们是第三方,需要通过中间人,中间人再操作系统的内容提供者。
    2. 我们需要做的就是:
      1. 获取中间人,ContentResolver  
      2. 提供uri,这里的uri就代表了我们想要观察的目标
      3. 注册一个内容观察者,ContentObserver
    3. 比如监听系统的所有短信变化
      1. 系统短信已经有了内容提供者,只要我们能够与系统短信内容提供者的uri匹配上,那么我们就能操作它。我们这时不需要写内容提供者。
      2. 新建工程,
  4. ContentResolver  内容提供者访问对象
    1. 访问系统短信的uri:content://sms
    2. 收件箱的uri:    content://sms/inbox




0 0
原创粉丝点击