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

Android中ContentProvider的用法

作者头像
指点
发布于 2019-01-18 09:20:04
发布于 2019-01-18 09:20:04
2K00
代码可运行
举报
文章被收录于专栏:指点的专栏指点的专栏
运行总次数:0
代码可运行

Android中,如果要将一个程序的数据共享给另一个程序,在之前的Android版本,我们可以设置Android文件和SharedPreferences操作的两个模式:MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 这两种模式来使得数据可以被其他应用程序读写,但是这两种模式在在Android4(具体4.几也不记得了。。。)的时候就被废除了,那么现在要在不同的Android程序之间共享数据的话就只能通过ContentProvider(内容提供器)来实现了(排除你是黑客的前提下)。 下面来看一下怎么来读取其他Android程序的数据。

首先,如果要访问一个应用程序通过ContentProvider共享的数据,一定要借助ContentResolver类,我们可以通过Context类的getContentResolver()方法获取ContentResolver类的对象,

之后,我们就可以通过ContentResolver类提供的一些方法对数据进行 增加、更改、删除、查询 操作(和数据库的4个操作类似)。

和数据库操作不同的是,ContentResolver类的这些操作都不是通过数据库表名进行的,而是通过传入ContentProvider共享数据的Uri(统一资源标识符,通过它可以找到任何文件所处的位置)对象来标识和操作共享的数据

接下来来看一下ContentResolver类提供的操作数据的4个方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
增加数据:insert(Uri url, ContentValues values)
第一个参数是要增加的数据所在数据表的Uri,第二个参数是通过
ContentValues对象储存的数据,通过键值对储存


删除数据:delete (Uri url, String where, String[]
                selectionArgs) 
第一个参数要删除的数据所在数据表的Uri,第二个参数是删除的条件,可以存在占位符,第三个参数是补全第二个参数的占位符


更改数据:update(Uri uri, ContentValues values, 
                String where, 
                String[] selectionArgs) 
第一个参数是要更改的数据所在数据表的Uri,第二个参数是更改后的数据,第三第四个参数是更改数据的条件(和删除类似)


查询数据:query(Uri uri, String[] projection, String 
                selection, String[] selectionArgs, 
                String sortOrder) 
第一个参数是要查询的数据所在数据表的Uri,第二个参数是要查询的具体列的信息,第三第四个参数是要查询的数据满足的条件,
第五个参数是查询结果的排序方式

下面通过一个小例子来理解: 通过ContentProvider来读取联系人信息并且建立自定义的ContentProvider,新建一个Android工程: main_activity.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/buttonShowContacts"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示电话簿" />
    <ListView 
        android:id="@+id/contactsList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

一个按钮,对应于获取联系人信息事件,一个ListView用于显示联系人的信息。 接下来是MainActivity.java:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.ArrayList;
import java.util.List;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    Button button = null;
    List<String> contactsList = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    ListView contactsView = null;
    ContentResolver contentResolver = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.buttonShowContacts);
        button.setOnClickListener(listener);

        contactsView = (ListView) findViewById(R.id.contactsList);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, contactsList);
        contactsView.setAdapter(adapter);

        contentResolver = getContentResolver(); // 获取ContentResolver对象
    }

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch(v.getId())
            {
            case R.id.buttonShowContacts:
                showContacts();
                break;
            }
        }
    };

    private void showContacts()
    {
        /*
         * 调用getContentResolver()方法获取ContentResolver对象,并且调用query方法,
         * 传入联系人的Uri,来查询联系人信息,类似于数据库的查询方法。
         */
        Cursor cursor = contentResolver.query(
    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null, null, null, null);
        if(cursor.moveToFirst())
        {
            contactsList.clear();
            do
            {
                /*
                 * 获取联系人姓名
                 */
                String str = "姓名:" + cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)) + "\n";
                /*
                 * 获取联系人电话号码
                 */
                str += "电话:" + cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.Phone.NUMBER));
                contactsList.add(str);
            }while(cursor.moveToNext());
        }
        cursor.close();
        adapter.notifyDataSetChanged(); // 适配器发送更改后的数据
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

MainActivity.java主要做一件事:自定义一个方showContacts() 用于获取联系人信息并且显示在ListView控件中,这个方法中 首先调用了ContentResolver类的query方法并且传入储存联系人信息那张数据表的Uri,用于查询联系人信息那张数据表的数据,之后对查询的返回结果Cursor进行处理,将储存联系人信息的ArrayList<String>对象中的数据清空,并且将Cursor对象中储存的数据提取到ArrayList<String>对象中, 之后调用适配器adapter.notifyDataSetChanged来更新适配器中的数据。 来看一下效果:

单击“显示电话簿”按钮:

在这里,如果你用的是模拟器,并且模拟器中没有联系人的话要添加几个联系人。不然就显示的是空界面。这个需要注意一下

如果博客中有什么不正确的地方,还请多多指点。 谢谢观看。。。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/09/13
4290
Content Provider 之 最终弹   实战体验跨程序数据共享(结合SQLiteDemo)
Android基础总结(6)——内容提供器
  前面学习的数据持久化技术包括文件存储、SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问。虽然文件存储和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种操作模式,可以实现不同应用程序间的数据共享,但是这两种模式在Android4.2版本中就已经被废弃了。目前,Android系统推荐使用一种更加安全可靠的内容提供器技术。 内容提供器(Content Provider)主要用于在不
mukekeheart
2018/02/27
1.2K0
Android必知必会的四大组件--ContentProvider
作为四大组件之一,它的地位绝对不容许轻视的。但是我们在哪里有用到过他呢?其实很多场景都有,比如说你在使用app时,是不是经常的会询问你是否开启通讯录的访问,如果你同意了,这个时候ContentProvider就发挥了他的作用。
ClericYi
2020/06/23
5450
Android查缺补漏--ContentProvider的使用
本文主要介绍了如何在Android应用中通过ContentProvider将自定义数据源添加到Android的联系人应用中,包括自定义ContentProvider、自定义SQLiteOpenHelper以及自定义UriMatcher。同时,本文还提供了完整的示例代码以及详细的注释,帮助读者更好地理解整个实现过程。
codingblock
2017/12/28
7590
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
在Android中有些数据(如通讯录、音频、视频文件等)是要供非常多应用程序使用的。为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据。比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能)。
全栈程序员站长
2022/07/07
7670
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/09/13
1.4K0
跨程序共享数据——Content Provider  之  ContentResolver基本用法 & 一个读取系统联系人的Demo
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 内容提供者
Android ContentProvider_1 使用方法
ContentProvider 是进程间内容共享的统一接口。注意:ContentProvider 的作用不是实现进程间通信,它只是为进程间通信提供了一套统一接口,真正实现进程间通信的是底层的 Binder 机制。
大公爵
2022/11/07
7010
Android ContentProvider_1 使用方法
ContentProvider初探
其实很多时候我们用到ContentProvider并不是自己暴露自己的数据,更多的时候通过 ContentResolver来读取其他应用的信息,最常用的莫过于读取系统APP,信息,联系人, 多媒体信息等!如果你想来调用这些ContentProvider就需要自行查阅相关的API资料了! 另外,不同的版本,可能对应着不同的URL!这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例,其他自行google~
小小工匠
2021/08/16
5490
Android四大组件之ContentProvider
Android四大组件之ContentProvider ContentProvider 安卓应用程序默认是无法获取到其他程序的数据,这是安卓安全学的基石(沙盒原理)。但是经常我们需要给其他应用
xiangzhihong
2018/01/26
1K0
Android 四大组件学习之ContentProvider二
上节学习了什么是ContentProvider,以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider
DragonKingZhu
2022/05/08
1640
Android 四大组件学习之ContentProvider二
Android点将台:济世儒侠[-ContentProvider-]
张风捷特烈
2024/02/09
2290
Android点将台:济世儒侠[-ContentProvider-]
读取联系人
读取联系人 新建项目ContactsTest 修改activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml
Dream城堡
2018/12/19
7300
Android学习--跨程序共享数据之内容提供其探究
      跨程序共享数据之内容提供器,这是个什么功能?看到这个名称的时候最能给我们提供信息的应该是“跨程序”这个词了,是的重点就是这个词,这个内容提供器的作用主要是用于在不同的引用程序之间实现数据共享的功能,它提供了一完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问的数据的安全性,在目前使用内容提供器是Android实现跨程序共享数据的标准方式。不同于文件存储和SharePreferences存储中的两种全局可读性操作模式,内容提供器可以选择只对那一部分数据进行共享,从而保证我们程序中的隐私数据不糊有泄漏的风险。
Mr.RisingSun
2018/08/20
6190
Android学习--跨程序共享数据之内容提供其探究
Android 第三次作业 contentprovider与resolver
1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;
张浪
2022/11/24
4490
Android四大组件之ContentProvider
Hi,大家好,我们又双叒叕见面啦,为了让大家快速的学习Android知识,我们每天都在更新文章,相信小伙伴们已经开始眼熟我们了!这一期我们讲解ContentProvider(内容提供者)相关知识,他也是我们近期更新的Android四大组件中最后一个。话不多说,让我们赶紧开始学习吧~
下码看花
2019/09/02
6590
Android四大组件之ContentProvider
Android开发笔记(五十四)数据共享接口ContentProvider
前面几节介绍了进程间通信的几种方式,包括消息包级别的Messenger、接口调用级别的AIDL、启动页面/服务级别的Notification,还有就是本节这个数据库级别的ContentProvider。 ContentProvider为存取数据提供统一的接口,它让不同APP之间得以共享数据。ContentProvider类本身是个服务端的数据存取接口,主要操作类似SQLite,也都提供了如下常见的数据库管理API: query : 查询数据。 insert : 插入数据。 update : 更新数据。 delete : 删除数据。 getType : 获取数据类型。 实际开发中,APP很少会开放数据接口给其他应用,所以ContentProvider类作为服务端接口反而基本用不到。Content组件中能够用到的场合,基本上是APP想要使用系统的手机通讯数据,比如查看联系人/短信/彩信/通话记录,以及对这些通讯信息进行增删改。
aqi00
2019/01/18
1.5K0
2-AIV--使用ContentProvider查询联系人
零、前言 [1].顾名思义,内容提供者,目的:实现跨进程间数据共享 [2].基于数据库提供数据 [3].如电话簿,短信,歌曲信息都是以数据库存储存储,都可以通过ContentProvider获取 [4].不太熟悉安卓运行时权限的童鞋可以看一下我封装的权限申请类: TI--安卓运行时权限完美封装 [5].如果只是想使用的人,直接把静态方法拷贝即可,想知道原理的,图片和注释认真看一下,也可以自己分析一下联系人的表。 [6].本文只打印一下查询结果:ListView篇将会界面展示数据,Xml篇将会
张风捷特烈
2018/09/26
5510
相关推荐
Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档