前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android中ContentProvider简介

Android中ContentProvider简介

作者头像
fanfan
发布于 2018-01-24 10:11:41
发布于 2018-01-24 10:11:41
72300
代码可运行
举报
文章被收录于专栏:编程思想之路编程思想之路
运行总次数:0
代码可运行

翻看Android源码可以发现,Android一般的代码架构如下:activity,service,receiver----contentProvider------db(file)

也就是说创建数据库保存数据,借助contentprovider对数据进行增删该查,上层利用Android组件进行交互。于是想着给自己新写的项目也添加个contentProvider来学习Android谷歌工程师的高大上,但从未用过contentprovider,这是第一次用,用完之后就发现一个问题

第一,contentprovider实际上就是将数据库的增删改查方法进行一个集成,给外界提供一个接口

第一,contentprovider是方便了应用程序之间(进程间)进行交换数据,如果你的apk的数据不需要与别的进程交换数据,根本无需使用contentprovider

第三,如果是一个程序间进行数据修改,完全可以自己集成一个提供增删改查的方法

所以呢,在你决定使用contentprovider之前先要看看你是否有使用它的必要。在解决问题之前,首先要分析问题,先动脑然后再动手

尽管如此,我还是依旧学习了一些contentprovider的用法,不为用在项目中,只是为了完善自己的知识体系。

既然明白contentProvider只是一个集成了增删改查的类给外界提供一个调用的接口,那么使用的思路,应该也很明确了

首先是创建数据库,自定义一个数据库的帮助类,来创建数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyDataOpenHelper extends SQLiteOpenHelper {

    private String tableName;

    public MyDataOpenHelper(Context context, String name, int version) {
        super(context, name, null, version);
        tableName = name;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE " +
                tableName +
                " (" +
                "Id integer primary key autoincrement," +
                CustomProvider.COLUMN_AGE +
                "," +
                CustomProvider.COLUME_NAME+
                "," +
                CustomProvider.COLUME_ID +
                ")");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

创建好数据库后创建一个自定义的provider

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomProvider extends ContentProvider {

    private SQLiteOpenHelper mDataOpenHelper;
    private SQLiteDatabase mDB;
    private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    public static final String AUTHORITY = "customProvider";

    private static final int ALL_STUDENT = 0;
    private static final int STUDENT = 1;
    private static final int QUERY_BY_ID = 2;
    private static final int QUERY_BY_AGE = 3;
    private static final int QUERY_BY_NAME = 4;
    public static final String TABLE = "student";
    public static final String COLUMN_AGE = "age";
    public static final String COLUME_NAME = "name";
    public static final String COLUME_ID = "student_id";

    static {
        //第一个参数authority为域名:customProvider
        //第二个参数为路径:student/#
        //第三个参数为匹配成功后返回的code
       matcher.addURI(  AUTHORITY ,TABLE,ALL_STUDENT);
        matcher.addURI(AUTHORITY,TABLE + "/#",STUDENT);
    }


    @Override
    public boolean onCreate() {
        mDataOpenHelper = new MyDataOpenHelper(getContext(),TABLE,1);
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

        mDB = mDataOpenHelper.getReadableDatabase();
        if (mDB.isOpen()){

            switch (matcher.match(uri)){
                case ALL_STUDENT:
                   return mDB.query(TABLE,projection,selection,selectionArgs,null,null,sortOrder);
                case STUDENT:
                    long id = ContentUris.parseId(uri);

                    return mDB.query(TABLE,null,"Id = " + id,selectionArgs,null,null,null);
                default:
                    break;
            }
            mDB.close();
        }
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {

        mDB = mDataOpenHelper.getWritableDatabase();
        if (mDB.isOpen()){

            long i = mDB.insert(TABLE,null,values);
            Log.i("fang","i = " + i);
            mDB.close();
        }
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

在你创建时会提示你去继承5个方法,增删改查以及getType,在这里因为是为了熟悉provider的用法,所以只在增加和查询的方法中添加了一些代码

先分析一下,在这里定义了一个Urimatcher的实例,可以去匹配uri,在这里定义了三种情况

第一种:unknown

第二种:all_student:

第三种:student

自定义了之后去在Androidmanifest中去注册一下,需要声明authority域名属性,与类中的相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<provider
            android:authorities="customProvider"
            android:name=".provider.CustomProvider"/>

也就是说如果程序想使用contentProvide就做这三步准备即可:

第一步,自定义SQLiteOpenHelper,创建表

第二步,自定义provider,集成增删该查方法

第三步,provider是组件,所以要想使用需要在清单配置文件中去配置

这些都做好以后就可以在activity,service,receiver中进行调用了,举个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ContentResolver resolver = getContentResolver();

        ContentValues values = new ContentValues();
        for (int i = 0; i < 2; i++) {
            values.put(CustomProvider.COLUME_NAME, i);
            values.put(CustomProvider.COLUMN_AGE, i);
            resolver.insert(Uri.parse("content://" + CustomProvider.AUTHORITY + "/" + CustomProvider.TABLE), values);
        }

这是往表中插入两条数据,也可以进行数据的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 cursor = resolver.query(Uri.parse("content://" + CustomProvider.AUTHORITY + "/" + CustomProvider.TABLE + "/2"), null, null, null, null);
        List<StudentBean> studentBean = new ArrayList<>();
        if (cursor != null) {
           while(cursor.moveToNext()) {
                StudentBean student = null;
                int nameIndex = cursor.getColumnIndexOrThrow(CustomProvider.COLUME_NAME);
                int ageIndex = cursor.getColumnIndexOrThrow(CustomProvider.COLUMN_AGE);
                int id = cursor.getColumnIndexOrThrow(CustomProvider.COLUME_ID);

                String name = cursor.getString(nameIndex);
                String age = cursor.getString(ageIndex);
                Log.i("fang",name);
                Log.i("fang",age);
                student = new StudentBean(name, age);
                studentBean.add(student);
            }


            cursor.close();

可以发现要想去使用contentprovider中集成好的方法,需要两步

第一:获取一个contentResolver对象:getCOntentResolver()方法

第二:在调用方法是传入一个uri:这个uri拼起来就是content://customProvidr/student/#,也就是content://域名/表名/要查询的列。

可以看到这样集成在每次调用时会超级麻烦,还不如自己集成的,所以如果是一个应用之间数据增删该查,不建议你使用contentProvider

如果看过我以前的博客的可以发现我早在半年前就打算去总结一个contentprovider的用法,但一直拖延着,眼高手低,内心着实羞愧,作为一个程序员,这样的做法很危险,谨以此文鼓励,铭记。

只有使用过才能明白使用环境,使用方法,以及这样做有什么不足。同时也给目前正在看视频只知道动脑或动眼而不愿动手的人一个小小建议

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-07-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
在Android中有些数据(如通讯录、音频、视频文件等)是要供非常多应用程序使用的。为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据。比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能)。
全栈程序员站长
2022/07/07
7590
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
ContentProvider
ContentProvider 内容提供者,应用程序间的数据交互,是为存储和获取数据提供的统一接口。 Contentprovider为应用间数据交互提供了安全的环境,它允许把自己的应用数据开放给其他应用进行 CRUD。怎么样进行操作可以自己规定,不用担心权限的问题。 当然如果不想被被人读取自己应用的数据就不需要这个内容提供者。 ContentResolver来访问和操作我们的数据。 ContentResolver 通过我们注册的uri就可以找到我们开放的数据。 关于uri 参考这篇文章:http://b
佛系编码
2018/05/22
6750
Android ContentProvider_1 使用方法
ContentProvider 是进程间内容共享的统一接口。注意:ContentProvider 的作用不是实现进程间通信,它只是为进程间通信提供了一套统一接口,真正实现进程间通信的是底层的 Binder 机制。
大公爵
2022/11/07
6910
Android ContentProvider_1 使用方法
Android 进阶11:进程通信之 ContentProvider 内容提供者
学习启舰大神,每篇文章写一句励志的话,与大家共勉。 When you are content to be simply yourself and don’t compare or compete,
张拭心 shixinzhang
2018/01/05
2.7K0
Android 进阶11:进程通信之 ContentProvider 内容提供者
ContentProvider
构建content URI public class TaskContract { /* COMPLETED (1) Add content provider constants to the Contract Clients need to know how to access the task data, and it's your job to provide these content URI's for the path to that data:
acc8226
2022/05/17
2270
ContentProvider
Android四大组件之ContentProvider
Hi,大家好,我们又双叒叕见面啦,为了让大家快速的学习Android知识,我们每天都在更新文章,相信小伙伴们已经开始眼熟我们了!这一期我们讲解ContentProvider(内容提供者)相关知识,他也是我们近期更新的Android四大组件中最后一个。话不多说,让我们赶紧开始学习吧~
下码看花
2019/09/02
6570
Android四大组件之ContentProvider
Android ContentProvider实例详解
ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。  Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到ContentProvider。而且Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
Android技术干货分享
2019/05/07
2.4K0
Android ContentProvider实例详解
Android四大组件之ContentProvider
Android四大组件之ContentProvider ContentProvider 安卓应用程序默认是无法获取到其他程序的数据,这是安卓安全学的基石(沙盒原理)。但是经常我们需要给其他应用
xiangzhihong
2018/01/26
1K0
Android:关于ContentProvider的知识都在这里了!
4.2.2 MIME类型组成 每种MIME类型 由2部分组成 = 类型 + 子类型
Carson.Ho
2019/02/22
2.5K0
Android Content provider 组件
Content Provider 属于Android应用程序的组件之一,作为应用程序之间唯一的共享数据的途径,Content Provider 主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的借口。
程序员小何SS
2021/12/01
5210
Android进程间通信(五):进程间通信的方式之ContentProvider
前面我们介绍了: 进程间通信基础介绍 通过AIDL介绍Binder的工作机制 通过 Bundle、文件共享、Messenger实现进程间通信 进程间通信的方式之AIDL
103style
2022/12/19
6340
安卓开发_深入理解Content Provider
一、Content Provider概述 Content Provider用于保存和获取数据,并使其对所有应用程序可见,这是不同应用程序之间共享数据的唯一方式,因为在Android中没有提供所有应用可以共同访问的公共存储区域 1、  Content Provider内部的数据如何保存是由其设计者决定的,而所有的的Content Provider都实现一组通用的方法,用来提供数据的增删改查操作 2、  客户端如果要使用这些操作方法,可以通过ContentProvider对象实现对 Content Provid
听着music睡
2018/05/18
7240
安卓基础干货(九):安卓内容提供者的学习
ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider 对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。 使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
緣來
2018/09/18
1.7K0
android学习笔记----内容提供者
内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前,使用内容提供器是android实现跨程序共享数据的标准方式。
砖业洋__
2023/05/06
4470
android学习笔记----内容提供者
Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/09/13
4280
Content Provider 之 最终弹   实战体验跨程序数据共享(结合SQLiteDemo)
【Android从零单排系列四十一】《Android数据存储方式-ContentProvider》
小伙伴们,在上文中我们介绍了Android数据存储中的SharedPreference,本文我们继续盘点介绍Android开发中的另一个数据存储方式ContentProvider。
再见孙悟空_
2023/07/17
2970
Android必知必会的四大组件--ContentProvider
作为四大组件之一,它的地位绝对不容许轻视的。但是我们在哪里有用到过他呢?其实很多场景都有,比如说你在使用app时,是不是经常的会询问你是否开启通讯录的访问,如果你同意了,这个时候ContentProvider就发挥了他的作用。
ClericYi
2020/06/23
5410
Android 第三次作业 contentprovider与resolver
1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;
张浪
2022/11/24
4420
ContentProvider初探
其实很多时候我们用到ContentProvider并不是自己暴露自己的数据,更多的时候通过 ContentResolver来读取其他应用的信息,最常用的莫过于读取系统APP,信息,联系人, 多媒体信息等!如果你想来调用这些ContentProvider就需要自行查阅相关的API资料了! 另外,不同的版本,可能对应着不同的URL!这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例,其他自行google~
小小工匠
2021/08/16
5410
Android点将台:济世儒侠[-ContentProvider-]
张风捷特烈
2024/02/09
2160
Android点将台:济世儒侠[-ContentProvider-]
相关推荐
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文