ContentProvider

来源:互联网 发布:火石软件招聘 编辑:程序博客网 时间:2024/05/16 14:43

介绍

  • 他是四大组件之一!
  • 内容提供者,将自身的数据库提供给其他程序访问!
  • 如果你不打算把自己的数据库数据分享给其他程序,那么无需创建内容提供者!
  • ContentProvider ContentResolver
  • 提供和获取数据的范围就是在一个手机中

ContentResolver访问ContentProvider数据

  • 概念图
  • 使用步骤
    • 获取ContentResolver对象
      • Context.getContentResolver()
    • 获取对应的Uri(Uri指向ContentProvider具体的哪个表)
    • ContentResolver的四个方法
      • 查询:
        • ContentResolver:query(Uri,字段名,条件,占位符,orderBy)
        • SQLiteDatabase:query(表名,字段名,条件,占位符,roupBy,having,orderBy)
      • 删除:
        • ContentResolver:delete(Uri,条件,占位符)
        • SQLiteDatabase:delete(表名,条件,占位符)
      • 修改:
        • ContentResolver:update(Uri,ContentValues,条件,占位符)
        • SQLiteDatabase:update(表名,ContentValues,条件,占位符)
      • 插入:
        • ContentResolver:inser(Uri,ContentValues)
        • SQLiteDatabase:inser(表名,null,ContentValues)
    • 操作通话记录
      • Calls.Content_URI
    • 操作通讯录
      • private String uri_raw = "content://com.android.contacts/raw_contacts";
        private String uri_data = "content://com.android.contacts/data";
      • raw_contacts
      • data
      • mimetypes
    • Cursor关闭的问题(重点!!!):
      • Cursor在没有用的时候,必须要关闭!
      • 关闭方法为cursor.close();
      • 注意:Cursor在没有使用完的情况下,不要关闭,否则影响数据显示!

ContentProvider自定义

  • 需求:
    • 创建数据库:SQLiteOpenHelper
    • 暴露数据:ContentProvider
  • 创建时间:
    • Application -> onCreate()方法,当程序创建的时候调用
      Activity -> onCreate()方法,当打开对应Activity的时候调用
      ContentProvider -> onCreate()方法,当ContentProvider创建时候调用
    • 出现的先后顺序:
      • ContentProvider的onCreate()方法 –> Application的onCreate()方法 –> Activity的onCreate()方法
    • -
  • 使用方法:
    • 创建数据库
    • 创建以各类去继承ContentProvider
      • onCreate():打开数据库,获取数据库操作工具类对象
        • getContext()可以获得上下文对象
    • 设计路径结构
      • 开发者通常通过追加指向单个表的路径来根据权限创建内容 URI。例如,如果您有两个表:table1和table2,则可以通过合并上一示例中的权限来生成内容 URI com.example..provider/table1和com.example..provider/table2。路径并不限定于单个段,也无需为每一级路径都创建一个表。
    • 创建静态代码块,给匹配器添加匹配Uri
      • //优先执行
        static{
        //创建对象不匹配
        matcher = new UriMatcher(UriMatcher.NO_MATCH);
        //content://authority/表名
        matcher.addURI(AUTHORITY, tableName, CODE);
        }

        其中AUTHORITY为常量字符串,CODE为常量整数,二者都为全局变量,AUTHORITY为content://authority/,CODE用于与完整Uri对应,方便使用switch语句判断
    • 重写操作方法
      • query、insert、update、delete
      • 匹配器 匹配传递过来的Uri 区分操作表
        int code = UriMacther.match(uri)
      • 具体操作数据库
        SQLiteDataBase 操作数据库
    • 声明ContentProvider
      • <provider
        android:name="com.example.android_day14_contentprovider_01.MyProvider"
        //Uri 中间部分需要声明
        //在同一个手机中,中间部分不能相同
        android:authorities="com.example.myprovider.provider"
        //是否支持其他程序访问
        android:exported="true"
        android:permission="" 读写权限
        android:readPermission="" 读权限
        android:writePermission="" 写权限>
    • 自定义权限
      • 权限就是一个字符串!但是这个字符串必须声明!
      • <permission
        android:name="this is a permission"
        android:label="这是自定义权限的说明"
        android:protectionLevel="normal" >
        </permission>
0 0
原创粉丝点击