(014) 安卓——远程存储 ContentProvider 内容提供者

实现持久化的技术中我们前面已经讲解了4中 今天小遍再跟大家回顾一下远程存储 ContentProvider ——内容提供者
关于存储的分类 我们大体可以总结为:

本地存储

        共享参数

        File存储

        数据库存储

远程存储

        ContentProvider

一, 什么是ContentProvider?

    多个应用程序之间数据存储和检索的桥梁, 实现的是多个应用程序之间数据的共享 最重要的他是四大组件之一

    是多个应用程序之间数据共享的唯一方式


   注意:

    如果想要访问ContentProvider暴露的数据, 那么需要通过ContentResolver接口获取数据

    如果想要暴露自己应用程序的数据, 则需要自定义一个ContentProvider, 然后将数据暴露出去
二, 作用

    将应用程序的私有数据向外提供一个访问的接口, 基于URI的方式


三, URI 统一资源标识符 (在应用程序中是唯一)

    格式: content://应用程序的包名.provider/表名(一般是自定义)


四, 分析

    ContentResolver     内容解析器    负责解析ContentProvider暴率出来的数据    "客户端"

    ContentProvider     内容提供者    负责向外暴露数据             "服务器"

五, 实例

实例一, 访问短信记录

            uri = "content://sms"

            1, 得到内容解析器对象:

                ContentResolver resolver = getContentResolver()

            2, 通过URI格式, 解析数据 

                Cursor cursor = resolver.query(Uri,字段,条件, 条件值, 排序);

            3, 在清单文件中添加读取短信的权限

                android.permission.READ_SMS


            实例二, 访问联系人列表 

            uri = "content://com.android.contacts/contacts"

            1, 得到内容解析器对象

            2, 通过Uri格式,解析数据

            3, 在清单文件中添加读取联系人的权限


            raw_contacts(联系人表   有多少个联系人, 就有多少条记录)

                _id     主键

                display_name    联系人名称


            data  (实际内容)  同一个人会有多条记录,  姓名, 电话,邮箱.....


                _id     主键

                raw_contact_id  (raw_contacts主键)   当前数据是那个用户的

                mimetype_id (mimetypes 主键)     当前数据是什么类型( 姓名, 电话,邮箱....)



            mimetypes  (数据类型)

                _id             主键

                        (1 邮箱, 5 电话  , 7 姓名)

六, 自定义ContentProvider

1, 定义一个类, 继承ContentProvider, 重写父类的6个方法

            onCreate()  初始化工作

            query(Uri uri,....)   查询数据

            insert(Uri uri,....)   添加数据

            update(Uri uri,....)   修改数据

            delete(Uri uri,....)   删除数据

            getType(Uri uri)    只实现, 不做处理




        2, 声明ContentProvider的唯一标识, 必须是小写字母

        3, 声明访问数据库中的那些表的code

        4, 声明Uri的匹配器,实例化
            private static UriMatcher uriMatcher;
            static{

                // code  匹配码   UriMatcher.NO_MATCH : 不匹配任何Uri
                uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

                //注册Uri
                /**
                 * authority    ContentProvider的唯一标识
                 * path         路径(建议为表名, 但是不一定) 
                 * code         当前Uir的匹配码
                 */
                //t_user表中的数据 :  content://com.qf.day16_contentprovider_01.qf/t_user ---编码:1
                uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);

                //t_older表中的数据: content://com.qf.day16_contentprovider_01.qf/t_order ---编码:6
                uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER);
            }

        5, 定义一个数据库的帮助类, 并在onCreate() 方法中初始化

        6, 在相应的增删改查方法中通过Uri匹配器, 判断当前传入的Uri到底是操作那张表的code

            if(uriMatcher.match(uri) == CODE_USER){.....}


        7, 在清单文件中,注册ContentProvider  

            <!-- 注册ContentProvider 
                name:   说明要注册的是那个ContentProvider   全类名
                authorities  唯一标识  必须与ContentProvider中的唯一标识完全一直(复制过去)
                exported   声明当前的类 可以被外部的应用程序访问
            -->
            <provider 
                android:name="com.qf.day16_contentprovider_01.provider.MyContentProvider"
                android:authorities="com.qf.day16_contentprovider_01.qf"
                android:exported="true"
                />



    ContentUris中的方法:

    ContentUris.parseId(newUri)   从uri中解析ID

    ContentUris.withAppendedId(uri, id);  在uir上 , 追加ID

小遍结语:我们生活中充满了一些 饮食、睡眠、游玩、恋爱,也就是说我们不得不接触一些生活中美好的事情,不过我们必须不屈服于这些事物。因为要把时间用在最对的地方》》》》》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值