Android 开发艺术探索之---ContentProvider(内容提供者)

1.什么是内容提供者?

     首先在android 开发艺术探索这边书中 我们都知道ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用比较少。ContentProvider为不同的软件之间数据共享,提供统一的接口。而且ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。至于如何从URI中识别出外界需要的是哪个“数据库”这就是Android底层需要做的事情了,也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用我们自己应用中的文件、数据库内存储的信息。当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Android系统中,很多数据如:联系人信息、短信信息、图片库、音频库等,这些信息在开发中还是经常用到的,这些信息谷歌工程师已经帮我们封装好了,我们可以使用谷歌给我的Uri去直接访问这些数据。所以对于ContentProvider我们还是需要认真的学习的,在遇到获取联系人信息,图片库,音视频库等需求的时候,才能更好的实现功能。

2.为什么会有内容提供者?

       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式,这也是为什么会有内容提供者的原因。

在这里解释一下:怎么理解ContentProvider统一了数据访问方式

根据官网上的描述,content provider主要是提供应用程序之间的数据共享。比如App A 需要App B的数据能用shared preference?用文件的话,还只能用external file,但是可能没有外存,文件可能会被删除,权限问题等等。所以content provider+content resolver是最好的方式。

而且记住,content provider+content resolver只是提供了应用程序之间的一个通道,具体的数据处理是在content provider中,contetn provider 对底层的数据存储方法没有任何的要求 有可能是文件,可能是sqlite,也有可能是采用内存中的一个对象来进行数据存储。

3.应该怎么实现自己的ContentProvider?

下面是一个简单的实列 他演示了ContentProvider的工作过程 首先是创建一个MyContentProvider类 ,它继承ContentProvider并实现了ContentProvider的六个必须要实现的方法  在下面代码中 我们什么都么有干 尽管如此  这个MyContentProvider 也是可以工作的  只是它无法向外界提供有效的数据而已


然后接着我们需要在功能清单中Manifest中注册 MyContentProvider 如下图所示 其中 android:authorities="star.liuwen.com.endcontentprovider.MyContentProvider" 是ContentProvider中的唯一标识  而process 则是独立进程的标志  



MainActivuty中的代码

然后我们可以看到打印出来的日志


从日志中我们可以看到MyContentProvider 中的query方法被调用了三次 并且三次都是在不同的线程当中  可以看出来  他们都是运行在一个BInder线程当中  而onCreate()方法则是在主线程当中  也就是我们的UI线程

到这里 我们自定义的MyContentProvider 已经跑通了 虽然MyContentProvider 中没有返回任何的数据 所以接下来 我们继续完善 需要MyContentProvider 能够对外提供数据 上面我写了Contetn provider 对底层的数据存储方法没有任何的要求 可以是文件 也可以是SqLite 这里我们简单的用SqLite来实现存储


SqLiteHelper数据帮手

上面代码是一个简单的数据库实现 我们借助SqLiteHelper 来管理数据可的创建 支持 和升级 下面我们就要通过MyContentProvider向外界提供数据库中的信息  我们知道 ContentProvider 是通过Uri 来区分外界要访问的数据集合 在本列中支持外界对MyContentProvider 中的book表 和user表进行访问 为了知道外界要访问的是哪个表 我们需要为他们定义单独的Uri 和Uri_code 并将Uri和Uri_code 相关联 我们可以使用UriMatcher的addUrI方法将Uri_code关联到一起 这样 当外界请求访问MyContentProvider 时,我们就可以根据请求的Uri来得到Uri_code 有了Uri_code 我们就可以知道外界想要访问哪个表 然后就可以进行相应的数据操作了 


完整代码就是这样的 

下面在看Activity中的 代码


我这里的代码都是截图 也是希望大家能自己敲一遍 好 接下来我们看打印的日志是怎样的


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

推荐阅读更多精彩内容