内容提供者

  • 应用的数据库是不允许其他应用访问的

  • 内容提供者的作用就是让别的应用访问到你的数据库

  • 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数据库的代码,举例增方法

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

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

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

UriMatcher

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

  • 添加匹配规则

      //指定多条urium.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匹配器可以实现操作不同的表

      @Overridepublic Uri insert(Uri uri, ContentValues values) {if(um.match(uri) == PERSON_CODE){db.insert("person", null, values);}else if(um.match(uri) == COMPANY_CODE){db.insert("company", null, values);}else{throw new IllegalArgumentException();}return uri;}
    
  • 如果路径中带有数字,把数字提取出来的api

      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"), new String[]{"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 = new ContentValues();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"), new String[]{"contact_id"}, null, null, null);
    
  • 然后拿着联系人id去data表查询属于该联系人的信息

      Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{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);}else if("vnd.android.cursor.item/name".equals(mimetype)){contact.setName(data1);}else if("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 = new ContentValues();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 = new ContentValues();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, new MyObserver(new Handler()));class MyObserver extends ContentObserver{public MyObserver(Handler handler) {super(handler);// TODO Auto-generated constructor stub}//内容观察者收到数据库发生改变的通知时,会调用此方法@Overridepublic void onChange(boolean selfChange) {}}
    
  • 在内容提供者中发通知的代码

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

Android入门笔记10相关推荐

  1. Android入门笔记之更改手机屏幕方向

    Android入门笔记之更改手机屏幕方向 <1>简介 通过一个按钮组来改变横屏竖屏显示. <2>关键步骤 主要通过android.app.activity.getRequest ...

  2. Python数据分析入门笔记10——简单案例练习(学生信息分析)

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  3. 云炬Android开发笔记 10主界面-首页UI与数据解析器开发(RecyclerView)

    阅读目录 1.创建首页UI 1.1 检查依赖是否存在 1.2 布局 1.3 控件查找 2.首页下拉刷新实现 2.1[初始化] 2.2 封装刷新功能 2.3 加载数据的处理 3. 首页数据结构分析 3. ...

  4. Android学习笔记10:TextView的使用

    TextView不仅可以用于显示丰富的文本信息,还可以用来显示图文并茂的混排页面. 1.TextView常用属性 TextView的常用属性有以下一些: setText();              ...

  5. Android入门(10)| Fragment碎片详解

    文章目录 为什么要使用碎片(Fragment) 实例 布局文件 Fragment Activity 动态添加碎片 布局文件 Fragment Activity 碎片通信 Fragment 布局文件 A ...

  6. 【机器学习入门笔记10:TensorFlow矩阵基础】20190217

    2019-02-17  by 崔斐然 #pacehold 实现算术操作:运算时实时插入 #placehold import os import tensorflow as tf os.environ[ ...

  7. Android Studio 基础入门笔记

    Android Studio 基础入门笔记 Android Studio 基础入门笔记 为什么选择使用 Android Studio 而不是EclipseADT 安卓配置JDK AS如何更新 常规的 ...

  8. Python 网络爬虫笔记10 -- Scrapy 使用入门

    Python 网络爬虫笔记10 – Scrapy 使用入门 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接: ...

  9. onenote 入门笔记_Windows 10中的OneNote入门指南

    onenote 入门笔记 Microsoft has revamped many of its internal apps to match both the design aesthetic and ...

  10. Python学习笔记--10.Django框架快速入门之后台管理admin(书籍管理系统)

    Python学习笔记--10.Django框架快速入门之后台管理 一.Django框架介绍 二.创建第一个Django项目 三.应用的创建和使用 四.项目的数据库模型 ORM对象关系映射 sqlite ...

最新文章

  1. NLP词性标注数据准备及模型训练实例
  2. 大跌眼镜!杭州一程序员年薪 30 万,竟靠偷车厘子缓解压力?
  3. WebBrowser 操作(从网上收集)
  4. spring ldap_Spring 3,Spring Web Services 2和LDAP安全
  5. Shell自动上传下载文件到SFTP服务器
  6. python + opencv: 解决不能读取视频的问题
  7. java中实体类中实现Serializable接口的作用
  8. 正经人一辈子都用不到的 JavaScript 方法总结 (一)
  9. Ubuntu20.04下opencv的安装
  10. 研华服务器显示不了全屏啊,ppt不能全屏显示怎么办 ppt全屏显示不了的解决方法...
  11. 在Arduino和ESP32-s2环境下,测试WiFi Fine Time Measurement (FTM) Round Trip Time (RTT) 的定位和测距
  12. win7 下面串口驱动装好串口工具却找不到端口解决的方法
  13. 计算机视觉论文-2021-07-30
  14. 被互联网租房套路割韭菜的年轻人
  15. 2022危险化学品经营单位安全管理人员特种作业证考试题库模拟考试平台操作
  16. cmake学习笔记--cmake的打印、创建工程等基本操作(1)
  17. PDPS软件:机器人搬运工艺应用虚拟仿真操作方法
  18. UML之教学管理系统——1、需求分析
  19. 二十八、K8s最小服务漏洞2-OPA
  20. 中国超级计算机放哪了,中国的超级计算机都在做哪些工作?

热门文章

  1. 8 对象、类与面向对象编程
  2. python基础--字符串
  3. 凸优化第五章对偶 5.3 几何解释
  4. 使用源代码编译安装基于LAMP的网站架构
  5. Excel数据透视表中的值计算
  6. 图像处理-线性滤波-2 图像微分(1、2阶导数和拉普拉斯算子)
  7. Jenkins实现持续集成 上传远程服务器war 并执行sh脚本重启
  8. CF AIM Tech Round 4 (Div. 1) A. Sorting by Subsequences
  9. Oracle11g在Windows和Linux下imp导入表,exp导出表,sqluldr2导出表,sqlldr导入表
  10. Network 第三篇 - STP生成树协议