内容提供者(掌握)

  • 应用的数据库是不允许其他应用访问的
  • 内容提供者的作用就是让别的应用访问到你的私有数据
  • 自定义内容提供者,继承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基础总结(十)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. <Android 基础(十)> FloatingActionButton

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

  8. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  9. Android基础夯实--重温动画(二)之Frame Animation

    心灵鸡汤:天下事有难易乎,为之,则难者亦易矣:不为,则易者亦难矣. 摘要 当你已经掌握了Tween Animation之后,再来看Frame Animation,你就会顿悟,喔,原来Frame Ani ...

  10. Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解

    只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...

随机推荐

  1. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  2. BI解决方案分享:地产BI数据分析系统的建设

    近几年中国地产行业发展迅猛,行业整合已成大势所趋,逐步由区域开发转变为集团化的跨地区综合开发商.然而,对于处在超常规速度发展的房地产企业来说,其面临的挑战也是超常规的.企业要在有限的资金和人力条件下, ...

  3. 日期关联取最近日期的SQL

    SQL怎么关联,如下图A表用日期加产品编号关联B表的时候,如果日期不存在,则取之前最近一个日期的值,比如A表2012-07-31 关联B表,B表没有对应日期的,就取2012-07-30的 A表     ...

  4. WWDC2016 观后杂感

    WWDC2016已经落幕了,我没有熬夜看看的录播. 总的来说觉得还是比较兴奋的,因为苹果将更多的APi开发出来了,可以玩出更多花样了.

  5. android 自定义控件——(四)圆形进度条

    ----------------------------------↓↓圆形进度条(源代码下有属性解释)↓↓---------------------------------------------- ...

  6. linux jexus 服务 设置开机启动

    linux的服务开机设置一般在 /etc/init.d/里 而jexus的默认安装目录在 /usr/jexus里 启动文件为 jws 参数 有start stop restart 这里贡献一个刚写好的 ...

  7. 机器学习实战笔记(Python实现)-04-Logistic回归

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  8. Oracle学习笔记一 初识Oracle

    数据库简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.SQL 是 Structured Query Language(结构化查询语言)的首字母缩写词. 定义 数据库,简单来 ...

  9. 记录 git 常用的操作命令总结

    记录 git 常用的操作命令总结 2016-12-15 16:44:04 作为一名开发者,熟悉使用 git 代码管理工具是一项必备的基本技能.git 相较 SVN 而言,其优点不言而喻.git 的功能 ...

  10. WPF SpreadSheetGear电子表单

    我们经常会碰到生成Excel 界面并在其上操作的功能开发. 比如如下界面,我们需要在菜单里添加一个菜单按钮"Columns To Rows Transform" 功能是对多列批量转 ...