第七章 跨内容共享数据,探究内容提供器

7.1内容提供器简介

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能.内容提供器可以选择指定数据进行共享.使用方式包括使用现有的内容提供器读取和操作数据,或者创建自己的内容提供器给数据提供外部访问的接口.

7.2访问其他程序的接口

当应用程序通过内容提供器对其数据提供了外部访问的接口,任何其他的应用程序就可以对这部分数据进行访问.

7.2.1ContentResolver的基本用法

要借助ContentResolve类,通过Context中的getContentResolver()方法获取该类的实例.ContentResolver中提供了方法进行增删改查操作.

  • insert()用于添加数据.
  • update()用于更新数据.
  • delete()用于删除数据.
  • query()用于查询数据.

步骤:
1.ContentResolver中的增删改查方法都不接收表名参数,而使用一个Uri参数代替,这个参数称为内容URI.内容URI为内容提供器的数据建立了唯一的标识符.内容URI由权限(authority)和路径(path)组成.权限用于对不同的应用程序做区分,通常用程序包名命名(避免冲突).路径是用于对同一应用程序中不同的表做区分,通常添加到取新鲜后面.内容URI的标准写法是:

content://com.example.app.provider/table1

2.获取到的字符串需要解析为URI对象:

Uri uri = Uri.parse("content://com.example.app.provider/table1");

3.利用Uri对象查询数据.

Cursor cursor = getContentResolver().
query(uri,projection,selection,selectionArgs,sortOrder);

query()方法参数 对应 SQL 部分 描述
uri from table_name 指定查询某个应用程序下的某一张表
projection select column1, column2 指定查询的列名
selection where column = value 指定 where 的约束条件
selectionArgs 为 where 中的占位符提供具体的值
orderBy order by column1, column2 指定查询结果的排序方式

示例:
查找:

if (cursor != null) {
  while (cursor.moveToNext()) {
    String column1 =     cursor.getString(cursor.getColumnIndex("column1"));
    int column2 = cursor.getInt(cursor.getColumnIndex("column2"));
  } 
  cursor.close();
}

增加:

ContentValues values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);

修改:

ContentValues values = new ContentValues();
values.put("column1", "");
getContentResolver().update(uri, values, "column1 = ? and column2 = ?", newString[] {"text", "1"});

删除:

getContentResolver().delete(uri, "column2 = ?", new String[] { "1" });

7.2.2读取系统联系人

发生了点意外(悲伤脸

7.3创建自己的内容提供器

7.3.1创建内容提供器的步骤

创建一个类继承ContentProvider并重写

  • onCreate():初始化内容提供器时调用,用于数据库的创建和升级等操作返回true则初始化成功,false则失败.只有ContentResolver尝试访问程序中的数据时,内容提供器才会被初始化.
  • query():使用 uri 参数来确定查询哪张表, projection 参数用于确定查询哪些列,selection 和 selectionArgs 参数用于约束查询哪些行,sortOrder 参数用于对结果进行排序, 查询的结果存放在 Cursor 对象中返回.
  • insert():向内容提供器中添加一条数据,使用 uri 参数来确定要添加到的表,待添加的数据保存在 values 参数中,添加完成后,返回一个用于表示这条新记录的 URI.
  • update():更新内容提供器中已有的数据.使用 uri 参数来确定更新哪一张表中的数据,新数据保存在 values 参数中,,selection 和 selectionArgs 参数用于约束更新哪些行,,受影响的行数将作为返回值返回.
  • delete():从内容提供器中删除数据.使用 uri 参数来确定删除哪一张表中的数据,和 selectionArgs 参数用于约束删除哪些行, 被删除的行数将作为返回值返回.
  • getType():根据传入的内容 URI 来返回相应的 MIME 类型.

在内容URI后可以加ID号,返回的则是相应ID的数据.
可以使用通配符来匹配URI:

  • *:任意长度的字符
  • :任意长度的数字

借助URIMatcher可以实现内容URI的匹配.URIMatcher提供了addURI(),接受三个参数(权限.路径,自定义代码).返回一个匹配这个人Uri对象所对应的自定义代码.根据代码可知调用方访问的是那张表的数据.

public class MyProvider extends ContentProvider {
  public static final int TABLE1_DIR = 0;
  public static final int TABLE1_ITEM = 1;
  public static final int TABLE2_DIR = 2;
  public static final int TABLE2_ITEM = 3;
  private static UriMatcher uriMatcher;
  static {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI("com.example.app.provider", "table1",   TABLE1_DIR);
    uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);
    uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);
    uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);
  }
  ……
  @Overridepublic
   Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
    switch (uriMatcher.match(uri)) {
      case TABLE1_DIR:
        // 查询table1表中的所有数据
        break;
      case TABLE1_ITEM:
        // 查询table1表中的单条数据
       break;
      case TABLE2_DIR:
        // 查询table2表中的所有数据
        break;
      case TABLE2_ITEM:
        // 查询table2表中的单条数据
        break;
      default:
        break;
      }
      ……
    }
  ……
}

getType()是所有内容提供器都必须提供的方法.用于获取Uri对象对应的MIME类型.MINE由三部分组成:

  1. 必须以 vnd 开头。
  1. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。
  2. 最后接上 vnd.<authority>.<path>。

7.3.2 实现跨程序数据共享

略略略
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容