20170104第一行代码第七章Content Provider

一、简介

Content Provider用法有两种:

1、使用现有的CP来读取和操作相应程序中的数据;比如系统电话本。

2、创建自己的CP给我们的程序数据提供外部访问的接口。

二、访问已有的CP

当一个APP通过CP对其数据提供了外部的访问接口,则其他任何程序都可以通过这个接口对数据进行访问和操作。

1、ContentResolver用法

任何程序如果想访问其他程序通过CP共享的数据,都要使用ContentResolver,通过Context的getContentResolver()方法获取。

CR不接受表名,只接收内容URI。

URI:给CP中的数据建立了一个唯一的标识符,通过URI就可以访问该数据。

URI包含两个部分:权限authority+路径path。

权限authority:为了区分不同的程序,一般用该程序的包名做权限,com.example.app.provider

路径path:为了区分同一个APP中不同的表名。

URI标准格式为:content://com.example.app.provider/table1

其中,com.example.app为提供CP的程序包名;table1为数据所在表名。

使用方法:

ContentResolver cr=getContentResolver();

//查询数据

Cursor cursor=cr.query(uri, column1, “column1=? and column2=?”, new String[] {“ ”,” ”});

分别填入URI,查询的列名,查询的约束条件,占位符的值,最后还可以加上排序方式。

//增加数据

ContentValues values=new ContentValues();

values.put(“column1”,”hello”);

values.put(“column2”,”hujun”);

cr.insert(uri, values);

利用ContentValues将数据插入表。

//修改数据

ContentValues values=new ContentValues();

values.put(“column1”,”data_changed”);

cr.update(uri, values, “column1=? and column2=?”, new String[] {“ ”,” ”});

分别填入URI,values,以及约束条件和占位符的值。

//删除数据

cr.delete(uri, “column1=?” , new String[] {“data”});

删除列1中值为data的行。

2、读取系统联系人

手机联系人URI为:

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

该数据中包括联系人姓名、号码,所在列名分别为:

ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME

ContactsContract.CommonDataKinds.Phone.NUMBER

读取联系人信息,还需要获取权限

android.permission.READ_CONTACTS

读取代码为:

public void init()

{

ContentResolver cr=getContentResolver();

Cursor cursor=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

if(cursor!=null)

{

while(cursor.moveToNext())

{

String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

contacts.add(name+"\n"+number);

}}

if(cursor!=null)cursor.close();

}

三、创建自己的ContentProvider

1、创建CP步骤5部曲

(1)首先,新建MyContentProvider类去继承ContentProvider,需要重写6个方法:

onCreate():当存在ContentResolver尝试访问该CP时,自动调用onCreate()方法来初始化CP,通常在此完成数据库创建、升级等操作。

insert()、query()、update()、delete()就是操作CP提供的数据时使用的方法。

getType():根据传入的URI来返回相应的MIME类型?

(2)然后,如何解析URI?

UIR包括两种格式:

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

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

第一种格式,以路径table1结尾,访问表table1中所有数据;

第二种格式,在最后加上了id,即访问表table1中id为1的数据。

以通配符形式表示:

*:代表任意长度任意字符;

#:代表任意长度任意数字。

content://com.example.app.provider/*代表任意一个表

content://com.example.app.provider/table1/#代表表table1中任意一行

采用UriMatcher解析URI,

首先,配置UriMatcher,利用addURI()方法,将权限,路径和自定义代码传入;

然后,解析URI,利用match(uri)方法,如果该uri和之前addURI()写入的权限和路径相同时,返回自定义代码。

最后,通过这个自定义代码,即可采取不同的操作。

(3)重写query()等

public class MyContentProvider 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.contentprovider", "Book", TABLE1_DIR);

uriMatcher.addURI("com.example.contentprovider", "Book/#", TABLE1_ITEM);

uriMatcher.addURI("com.example.contentprovider", "Category", TABLE2_DIR);

uriMatcher.addURI("com.example.contentprovider", "Category/#", TABLE2_ITEM);

}

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

switch (uriMatcher.match(uri)) {

case TABLE1_DIR:

//查询Book中所有数据

break;

case TABLE1_ITEM:

//查询Book中单条数据,根据id

break;

case TABLE2_DIR:

//查询Category中单条数据

break;

case TABLE2_ITEM:

//查询Book中单条数据,根据id

break;

default:

break;

}

return null;

}

(4)重写getType()

获取URI对象所对应的MIME类型。

一个内容URI对应的MIME字符串包含3个部分:

1、必须以vnd开头;

2、如果内容URI以路径结尾,则后接android.cursor.dir/

如果内容URI以id结尾,则后接android.cursor.item/

3、最后接vnd..

例如:

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

MIMIE:vnd.android.cursor.dir/vnd.com.example.app.provider.table1

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

MIMIE:  vnd.android.cursor.item/vnd.com.example.app.provider.table1

(5)在AndroidManifest.xml中注册

android:name="com.example.contentprovider.MyContentProvider"

android:authorities="com.example.contentprovider.provider"

android:exported="true" >

android:exported="true"表示该provider可以被其他程序访问。

四、跨程序数据共享实践

数据发送方,需要构建ContentProvider,将数据共享;共享的数据在CP类中onCreate()封装到数据库中。

数据接收方,利用ContentResolver获取数据。

附录:

当URI中包含id,如何获取呢?

String id=uri.getPathSegments().get(1);

由此可见,路径获取方式为:String path=uri.getPathSegments().get(0);

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

推荐阅读更多精彩内容