内容提供者(掌握)

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

    1. @Override
    2. public Uri insert(Uri uri, ContentValues values) {
    3. db.insert("person", null, values);
    4. return uri;
    5. }
  • 在清单文件中定义内容提供者的标签,注意必须要有authorities属性,这是内容提供者的主机名,功能类似地址

    1. <provider android:name="com.itheima.contentprovider.PersonProvider"
    2. android:authorities="com.itheima.person"
    3. android:exported="true"
    4. ></provider>
  • 创建一个其他应用,访问自定义的内容提供者,实现对数据库的插入操作

    1. public void click(View v){
    2. //得到内容分解器对象
    3. ContentResolver cr = getContentResolver();
    4. ContentValues cv = new ContentValues();
    5. cv.put("name", "小方");
    6. cv.put("phone", 138856);
    7. cv.put("money", 3000);
    8. //url:内容提供者的主机名
    9. cr.insert(Uri.parse("content://com.itheima.person"), cv);
    10. }

UriMatcher(掌握)

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

    1. //指定多条uri
    2. um.addURI("com.itheima.person", "person", PERSON_CODE);
    3. um.addURI("com.itheima.person", "company", COMPANY_CODE);
    4. //#号可以代表任意数字
    5. um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
  • 通过Uri匹配器可以实现操作不同的表

    1. @Override
    2. public Uri insert(Uri uri, ContentValues values) {
    3. if(um.match(uri) == PERSON_CODE){
    4. db.insert("person", null, values);
    5. }
    6. else if(um.match(uri) == COMPANY_CODE){
    7. db.insert("company", null, values);
    8. }
    9. else{
    10. throw new IllegalArgumentException();
    11. }
    12. return uri;
    13. }
  • 如果路径中带有数字,把数字提取出来的api

    1. int id = (int) ContentUris.parseId(uri);

短信数据库(掌握)

  • 只需要关注sms表
  • 只需要关注4个字段
    • body:短信内容
    • address:短信的发件人或收件人号码(跟你聊天那哥们的号码)
    • date:短信时间
    • type:1为收到,2为发送

读取系统短信,首先查询源码获得短信数据库内容提供者的主机名和路径,然后访问内容提供者(掌握)

  1. ContentResolver cr = getContentResolver();
  2. Cursor c = cr.query(Uri.parse("content://sms"), new String[]{"body", "date", "address", "type"}, null, null, null);
  3. while(c.moveToNext()){
  4. String body = c.getString(0);
  5. String date = c.getString(1);
  6. String address = c.getString(2);
  7. String type = c.getString(3);
  8. System.out.println(body+";" + date + ";" + address + ";" + type);
  9. }

插入系统短信(熟悉)

  1. ContentResolver cr = getContentResolver();
  2. ContentValues cv = new ContentValues();
  3. cv.put("body", "您尾号为XXXX的招行储蓄卡收到转账1,000,000人民币");
  4. cv.put("address", 95555);
  5. cv.put("type", 1);
  6. cv.put("date", System.currentTimeMillis());
  7. 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

    1. Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
  • 然后拿着联系人id去data表查询属于该联系人的信息

    1. Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{contactId}, null);
  • 得到data1字段的值,就是联系人的信息,通过mimetype判断是什么类型的信息

    1. while(c.moveToNext()){
    2. String data1 = c.getString(0);
    3. String mimetype = c.getString(1);
    4. if("vnd.android.cursor.item/email_v2".equals(mimetype)){
    5. contact.setEmail(data1);
    6. }
    7. else if("vnd.android.cursor.item/name".equals(mimetype)){
    8. contact.setName(data1);
    9. }
    10. else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
    11. contact.setPhone(data1);
    12. }
    13. }

插入联系人(熟悉)

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

    1. cv.put("contact_id", _id);
    2. cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), cv);
  • 在data表插入数据

    • 插3个字段:data1、mimetype、raw_contact_id

      1. cv = new ContentValues();
      2. cv.put("data1", "赵六");
      3. cv.put("mimetype", "vnd.android.cursor.item/name");
      4. cv.put("raw_contact_id", _id);
      5. cr.insert(Uri.parse("content://com.android.contacts/data"), cv);
      6. cv = new ContentValues();
      7. cv.put("data1", "1596874");
      8. cv.put("mimetype", "vnd.android.cursor.item/phone_v2");
      9. cv.put("raw_contact_id", _id);
      10. cr.insert(Uri.parse("content://com.android.contacts/data"), cv);

内容观察者(掌握)

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

    1. cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
    2. class MyObserver extends ContentObserver{
    3. public MyObserver(Handler handler) {
    4. super(handler);
    5. // TODO Auto-generated constructor stub
    6. }
    7. //内容观察者收到数据库发生改变的通知时,会调用此方法
    8. @Override
    9. public void onChange(boolean selfChange) {
    10. }
    11. }
  • 在内容提供者中发通知的代码

    1. ContentResolver cr = getContext().getContentResolver();
    2. //发出通知,所有注册在这个uri上的内容观察者都可以收到通知
    3. cr.notifyChange(uri, null);

Android基础总结(十)ContentProvider的更多相关文章

  1. Android基础内容提供者ContentProvider的使用详解(转)

    1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不 ...

  2. <Android 基础(十九)> CoordinatorLayout

    介绍 CoordinatorLayout,中文翻译,协调布局,顾名思义,此布局中的子View之间,子View与父布局之间应该是可以协调工作的,如何协调,Behavior. 今天看下Android St ...

  3. <Android 基础(十八)> XLIFF

    介绍 XLIFF ,XML Localization Interchange File Format,XML本地化数据交换格式. 实际使用 1.布局文件 activity_main.xml <? ...

  4. <Android 基础(十六)> Toast

    介绍 A toast provides simple feedback about an operation in a small popup. It only fills the amount of ...

  5. <Android 基础(十五)> Alert Dialog

    介绍 The AlertDialog class allows you to build a variety of dialog designs and is often the only dialo ...

  6. <Android 基础(十四)> selector

    介绍 A StateListDrawable is a drawable object defined in XML that uses a several different images to r ...

  7. <Android 基础(十二)> TextInputLayout,让输入框更有灵性

    介绍 Layout which wraps an {@link android.widget.EditText} (or descendant) to show a floating label wh ...

  8. <Android 基础(十)> FloatingActionButton

    介绍 Source Code中的介绍如下: Floating action buttons are used for a special type of promoted action. They a ...

  9. Android基础新手教程——4.4.1 ContentProvider初探

    Android基础新手教程--4.4.1 ContentProvider初探 标签(空格分隔): Android基础新手教程 本节引言: 本节给大家带来的是Android四大组件中的最后一个--Con ...

随机推荐

  1. GNU General Public License v3.0

    Version 3, 29 June 2007       Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/& ...

  2. 使用IntelliJ IDEA开发Spring MVC HelloWorld

    https://blog.csdn.net/industriously/article/details/52851588 https://blog.csdn.net/slow_wakler/artic ...

  3. 【Python】nvshens按目录批量下载图片爬虫1.00(单线程版)

    # nvshens按目录批量下载图片爬虫1.00(单线程版) from bs4 import BeautifulSoup import requests import datetime import ...

  4. 【转载】AngularJS监听路由变化

    一.Angular 路由状态发生改变时可以通过' $stateChangeStart '.' $stateChangeSuccess '.' $stateChangeError '监听,通过注入'$l ...

  5. 深入理解Git (三) - 微命令上篇

    1 git hash-object 曾经讲过Git用Hash值作为Git对象的名字,那么详细是哪个命令呢? 我们能够先改动一个文件: echo "hongchangfirst" & ...

  6. Spring 的ioc

    Spring的两个非常重要的功能ioc和aop 依赖反转:依赖对象的获得被反转:很多非凡的应用都是由两个或多个类通过彼此的合作来上线业务逻辑.这使得每一个对象都须要与其它对象合作,也就是说 一个对象获 ...

  7. 算法笔记_128:完美洗牌算法(Java)

    目录 1 问题描述 2 解决方案 2.1位置置换算法 2.2 走环算法   1 问题描述 有一个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后变成{a1 ...

  8. Redhat 5禁止IPv6

    Redhat  5禁止IPv6 IPv6还没有全然普及,可是安装完系统之后IPv6是有效的,在一定程度上影响网络性能,所以在我们在全然不使用IPv6的情况下.最好关闭IPv6.如今我们就在本文以完整的 ...

  9. 关于Javascript表单验证

    //验证字符串非空        var Validator = {    VerityLib: {         IsNotEmpty: function (input) {        if ...

  10. python环境变量的配置

    每个python程序都须要import非常多包.有些系统包是不用安装的.有些第三方包是须要安装的. 在同一台电脑里的linux环境里,安装了第三方包,基本就适用于了整个系统环境. 这里能够用下面方法, ...