11.内容提供者

ContentProvider

  • 四大组件之一
  • 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用

  • 应用的数据库是不允许其他应用访问的,内容提供者的作用就是让别的应用访问到你的数据库
  • 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法

    @Override

    publicUri insert(Uri uri,ContentValues values){

    db.insert("person",null, values);

    return uri;

    }

  • 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址

    <providerandroid:name="com.itheima.contentprovider.PersonProvider"

    android:authorities="com.itheima.person"

    android:exported="true"

    ></provider>

  • 创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作

    publicvoid click(View v){

    //得到内容分解器对象

    ContentResolver cr = getContentResolver();

    ContentValues cv =newContentValues();

    cv.put("name","小方");

    cv.put("phone",138856);

    cv.put("money",3000);

    //url:内容提供者的主机名

    cr.insert(Uri.parse("content://com.itheima.person"), cv);

    }

UriMatcher

  • 用于判断一条uri跟指定的多条uri中的哪条匹配
  • 添加匹配规则

    //指定多条uri

    um.addURI("com.itheima.person","person", PERSON_CODE);

    um.addURI("com.itheima.person","company", COMPANY_CODE);

    //#号可以代表任意数字

    um.addURI("com.itheima.person","person/#", QUERY_ONE_PERSON_CODE);

  • 通过Uri匹配器可以实现操作不同的表

    @Override

    publicUri insert(Uri uri,ContentValues values){

    if(um.match(uri)== PERSON_CODE){

    db.insert("person",null, values);

    }

    elseif(um.match(uri)== COMPANY_CODE){

    db.insert("company",null, values);

    }

    else{

    thrownewIllegalArgumentException();

    }

    return uri;

    }

  • 如果路径中带有数字,把数字提取出来的api
    1. int id =(int)ContentUris.parseId(uri);

    短信数据库

    • 只需要关注sms表
    • 只需要关注4个字段
      • body:短信内容
      • address:短信的发件人或收件人号码(跟你聊天那哥们的号码)
      • date:短信时间
      • type:1为收到,2为发送
    • 读取系统短信,首先查询源码获得短信数据库内容提供者的主机名和路径,然后

      ContentResolver cr = getContentResolver();

      Cursor c = cr.query(Uri.parse("content://sms"),newString[]{"body","date","address","type"},null,null,null);

      while(c.moveToNext()){

      String body = c.getString(0);

      String date = c.getString(1);

      String address = c.getString(2);

      String type = c.getString(3);

      System.out.println(body+";"+ date +";"+ address +";"+ type);

      }

    • 插入系统短信

      ContentResolver cr = getContentResolver();

      ContentValues cv =newContentValues();

      cv.put("body","您尾号为XXXX的招行储蓄卡收到转账1,000,000人民币");

      cv.put("address",95555);

      cv.put("type",1);

      cv.put("date",System.currentTimeMillis());

      cr.insert(Uri.parse("content://sms"), cv);

    • 插入查询系统短信需要注册权限

    联系人数据库

    • raw_contacts表:

      • contact_id:联系人id
    • data表:联系人的具体信息,一个信息占一行
      • data1:信息的具体内容
      • raw_contact_id:联系人id,描述信息属于哪个联系人
      • mimetype_id:描述信息是属于什么类型
    • mimetypes表:通过mimetype_id到该表查看具体类型

    读取联系人

    • 先查询raw_contacts表拿到联系人id

      Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),newString[]{"contact_id"},null,null,null);

    • 然后拿着联系人id去data表查询属于该联系人的信息

      Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"),newString[]{"data1","mimetype"},"raw_contact_id = ?",newString[]{contactId},null);

    • 得到data1字段的值,就是联系人的信息,通过mimetype判断是什么类型的信息

      while(c.moveToNext()){

      String data1 = c.getString(0);

      String mimetype = c.getString(1);

      if("vnd.android.cursor.item/email_v2".equals(mimetype)){

      contact.setEmail(data1);

      }

      elseif("vnd.android.cursor.item/name".equals(mimetype)){

      contact.setName(data1);

      }

      elseif("vnd.android.cursor.item/phone_v2".equals(mimetype)){

      contact.setPhone(data1);

      }

      }

      插入联系人

    • 先查询raw_contacts表,确定新的联系人的id应该是多少
    • 把确定的联系人id插入raw_contacts表

      cv.put("contact_id", _id);

      cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), cv);

    • 在data表插入数据
      • 插3个字段:data1、mimetype、raw_contact_id

        cv =newContentValues();

        cv.put("data1","赵六");

        cv.put("mimetype","vnd.android.cursor.item/name");

        cv.put("raw_contact_id", _id);

        cr.insert(Uri.parse("content://com.android.contacts/data"), cv);

         

        cv =newContentValues();

        cv.put("data1","1596874");

        cv.put("mimetype","vnd.android.cursor.item/phone_v2");

        cv.put("raw_contact_id", _id);

        cr.insert(Uri.parse("content://com.android.contacts/data"), cv);


    内容观察者

    • 当数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知

      cr.registerContentObserver(Uri.parse("content://sms"),true,newMyObserver(newHandler()));

       

      classMyObserverextendsContentObserver{

       

      publicMyObserver(Handler handler){

      super(handler);

      // TODO Auto-generated constructor stub

      }

       

      //内容观察者收到数据库发生改变的通知时,会调用此方法

      @Override

      publicvoid onChange(boolean selfChange){

       

      }

       

      }

    • 在内容提供者中发通知的代码

      ContentResolver cr = getContext().getContentResolver();

      //发出通知,所有注册在这个uri上的内容观察者都可以收到通知

      cr.notifyChange(uri,null);

     

来自为知笔记(Wiz)

时间: 2024-10-17 10:10:02

11.内容提供者的相关文章

Android 中内容提供者的使用

在Android中内容提供者主要是用于不同程序之间的数据共享.内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序的数据,另一种是创建自己的内容提供器,供其他的程序访问. 使用现有的内容提供器来读取和操作相应程序的数据 ContentResolve中提供了一系列的方法用于对数据进行增删改查的操作,其中,insert()用于添加数据,update()用于数据更新,delete()方法用于删除数据,query()用于数据的查询. 在ContentResolve中,使用内容URI

【android基础篇】利用内容提供者实现短信备份

I,准备工作 系统存储短信内容的目录为:/dada/dada/com.android.providers.telephony/databases/mmssms.db,我们找到对应的数据库文件. 我们可以发现该文件对于第三方而言,是不可读不可写的,这里则必须要使用内容提供者. 问题就来了:我不知道主机名,也就无法作为中间人去找证监会打探消息.其实,完全没有关系,我们可以翻阅安卓的源代码: \packages\providers\TelephonyProvider的清单文件,因为主机名都配置在清单文

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

【安卓】如何使用广播和内容提供者来叫醒小伙伴(控制你的朋友)

摘要:通过多种方法来获取最新短信(静态广播,动态广播,监测数据库变动),保证短信的稳定获取,为了保证应用正常运行,代码中使用开机启动 service的方法,并且能够保证程序不被用户意外关闭出现无法提醒的问题,收到命令后使用内容提供者删除命令短信 ============================================================================================================================= 正

内容提供者和内容观察者

1.创建一个内容提供者,继承contentProvider,作为四大组件之一,contentProvider需要在配置文件中进行配置 <provider android:name="cn.itcast.mobilesafe.provider.AppLockedProvider" android:authorities="cn.itcast.applockprovider"> </provider> 2. package cn.itcast.m

Android组件系列----ContentProvider内容提供者【4】

(4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentResolver来操作ContentProvider所暴露处理的接口.一般使用Content.getContentResolver()方法获取ContentResolver对象.第一段中已经提到:ContentProvider有非常多对外能够訪问的方法,在ContentResolver中均有同名的方法

内容提供者(内容提供者实现、使用场景、Uri、短信的备份与还原等等)

1.编写内容提供者 步骤: 1.在工程里创建一个类,继承ContentProvider,重写了onCreate和增删改查的方法: 2.在清单文件中配置一个provider,需要这个数据authorities,用来唯一标识内容者的,在android4.1版本之后需要exported="true"的属性,否则其他应用程序没有权限访问这个内容提供者: 3.在onCreate方法里得到数据库的帮助类: 2.内容提供者工作的原理 模版代码: //uri匹配正时返回的匹配码 int code =

Android 内容提供者(ContentProvider)的简单实用

Android 中的数据库是对应用私有的,自己是无法使用别的应用的数据库的.但是往往有需求要我们使用另外一个应用或者系统应用的数据,这时候就彰显了内容提供者,ContentPrivider的作用,他就是两个应用数据的桥梁,通过内容提供者和内容接受者我们可以在不同应用间传递数据. ContentPrivider也可以视为一种数据存储.它存储数据的方式和使用它的应用程序无关,重要的是应用如何以一致的编程接口,来访问存储其中的数据.内容提供者与数据库的使用差不多,也可以增删改查.而且数据可以存储于数据

contentProvider 内容提供者

http://blog.csdn.net/woshixuye/article/details/8280879 实例代码当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI.之后其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver(内容解析器)传入相应的URI就可以了.contentProvider和Activity一样是Android的组件,故使用前需要在AndroidManifest.xml中注册,必须放在