ContentProvider概述

public abstract class

ContentProvider

extends Object

implements ComponentCallbacks2

Content providers are one of the primary building blocks of Android applications, providing content to applications. They encapsulate data and provide it to applications through the single ContentResolver interface. A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don’t need to share data amongst multiple applications you can use a database directly via SQLiteDatabase.

When a request is made via a ContentResolver the system inspects the authority of the given URI and passes the request to the content provider registered with the authority. The content provider can interpret the rest of the URI however it wants. The UriMatcher class is helpful for parsing URIs.

Android的ContentProvider作用就是在应用程序之间交换数据,假设我们採用文件共享的方式须要注意的是必须採用特定的数据訪问方式。而ContentProvider是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,而其它应用使用ContentResolver依据Uri去訪问操作指定数据。

ContentProvider也是Android应用的四大组件之中的一个,与Activity、Service、BroadcastReceiver类似,都须要在AndroidManifest.xml文件里进行配置。

ContentProvider的使用

  • 定义自己的ContentProvider类,继承子ContentProvider基类;
  • 在AndroidManifest.xml文件里注冊。而且绑定一个URL。

    public class ImageContentProvider extends ContentProvider{

    //该方法用于供外部应用从ContentProvider删除数据
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {return 0;
    }//该方法用于返回当前Url所代表数据的MIME类型
    @Override
    public String getType(Uri uri) {return null;
    }//该方法用于供外部应用往ContentProvider加入数据
    @Override
    public Uri insert(Uri uri, ContentValues values) {return null;
    }//该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次訪问它时才会被创建
    @Override
    public boolean onCreate() {return false;
    }//该方法用于供外部应用从ContentProvider中获取数据
    @Override
    public Cursor query(Uri uri, String[] values, String selection, String[] selectionArgs,String sortOrder) {return null;
    }//该方法用于供外部应用更新ContentProvider中的数据
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;
    }
    

    }

假设操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,

比如:要得到全部person记录的Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:”vnd.android.cursor.dir/person”。

假设要操作的数据属于非集合类型数据。那么MIME类型字符串应该以vnd.android.cursor.item/开头,

比如:得到id为10的person记录,Uri为content://com.ljq.provider.personprovider/person/10,那么返回的MIME类型字符串为:”vnd.android.cursor.item/person”。

注冊ContentProvider仅仅须要在

Uri概述

Uri还是非常easy理解的,我们能够和互联网的URL进行类比。

content://com.twilight.providers.imagecontentprovider/image/2

这里的意思就是訪问image数据总ID为2的记录。尽管大部分ContentProvider操作的数据都是来自于数据库,可是有时候能够来自于文件、XML或网络等其它的存储方式。

content://com.twilight.providers.imagecontentprovider/image/detail

这里的意思就是操作image节点下的detail节点。

Uri工具类

Android系统提供了2个操作Uri的工具类,各自是UriMatcher和ContentUris。

(1)UriMatcher类是用来匹配Uri

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
matcher.addURI("com.twilight.providers.imageprovider", "image", 1);
matcher.addURI("com.twilight.providers.imageprovider", "image/#", 2);
switch (matcher.match(Uri.parse("content://com.twilight.providers.imageprovider/image/7"))) {case 1:break;case 2:break;default:break;
}

注冊完须要匹配的Uri后,是用matcher.match(uri)方法对输入的Uri进行匹配,假设匹配就返回匹配码。

(2)ConentUris类用于操作Uri路径后面的ID部分。

Uri uri1 = Uri.parse("content://com.twilight.providers.imageprovider/image");
Uri resultUri = ContentUris.withAppendedId(uri1, 7);
Uri uri2 = Uri.parse("content://com.twilight.providers.imageprovider/image/7");
long resultId = ContentUris.parseId(uri2);

使用ContentResolver操作数据

ContentProvider相当于一个站点,而ContentResolver则相对于HttpClient。一般来说Content是单例模式,当多个应用程序通过ContentResolver来操作ContentProvider提供的数据时。数据操作会托付给同一个ContentProvider处理。

(1)调用Activity的ContentResolver()获取ContentResolver对象;
(2)使用ContentResolover的insert、delete、update、query方法操作数据,假设是系统提供的ContentProvider。仅仅须要知道ContentProvider的Uri就可以。

ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.twilight.providers.imageprovider/image");
ContentValues values = new ContentValues();
values.put("name", "pic1");
values.put("date", "2014-03-10");
resolver.insert(uri, values);

监听ContentProvider的数据改变

getContext().getContentResolver().notifyChange(uri, null);

当ContentProvider所共享的数据发生了改变,这行代码能够通知全部注冊在改Uri上的监听者,为了在应用程序中监听ContentProvider数据的改变。须要利用Android提供了ContentObserver基类。

监听ContentProvider数据改变的监听器须要继承ContentObserver类。并重写改基类所定义的onChange(boolean selfChange)方法。在使用的时候须要通过ContentProvider向指定的Uri注冊ContentObserver监听器。

        final class ImageObserver extends ContentObserver {public ImageObserver(Handler handler) {super(handler);}public void onChange(boolean selfChange) {}}getContentResolver().registerContentObserver(Uri.parse("content://com.twilight.providers.imageprovider/image"),true, new ImageObserver(new Handler()));

转载于:https://www.cnblogs.com/yxwkf/p/5271587.html

Android学习_ContentProvider和Uri相关推荐

  1. Android学习路线

    Android学习路线 第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环.  2.String和StringBuffer的使用.正则表达式.  3.面向对象的抽象,封装,继承 ...

  2. Android学习笔记(七):多个Activity和Intent

    根据www.mars-droid.com:Andriod开发视频教学,先跳过书本<Beginning Android 2>的几个章,我是这两个资源一起看,需要进行一下同步.先初步了解一下应 ...

  3. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  4. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

  5. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.       也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.       一看图啥都懂了: ...

  6. Android学习笔记(四九):通过Content Provider访问数据

    在上次笔记中,我们编写了自己的Provider,这次笔记,我们将通过Content Provider的Uri接口对数据进行访问,重写Android学习笔记(四二)中例子.在这里我们不在充分描述相关UI ...

  7. Android学习小Demo(10)ToDoList的加强版

    前两天去超市逛东西,问老板娘这个东西多少钱,那个东西多少钱,但是一两分钟后就搞混了,当时就想,我不是写了一个todo的吗,可以再拍照放上去,这样就有对比啦! 于是兴冲冲地赶回家,把功能给实现了,虽然这 ...

  8. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

  9. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...

    本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应 ...

最新文章

  1. mkfontscale没有这个命令_那些实用的小命令
  2. StoreFront 登陆页面的话持续时间
  3. project 模板_不会绘制横道图?18个施工进度计划横道图模板,可一键自动生成,方便快捷易操作,直观形象,相当好用...
  4. python读取postgresql数据库并发送相关提醒邮件
  5. 反编译后怎么修改服务器地址,反编译后怎么修改服务器地址
  6. Qt4_内置的窗口部件类和对话框类
  7. mysql使用中文报错,hibernate mysql 插入中文错误
  8. HBase Java API类介绍
  9. 第十五章、实现属性以访问字段
  10. 在 kali 中下载使用 Nessus
  11. python判断字符串大小写的三大函数——islower、isupper、istitle函数的用法及实例
  12. 永洪科技发布Yonghong Z-Suite V7.5 重新定义大数据驱动业务增长成功标准
  13. 正确选择餐具,健康美好生活
  14. layui-模糊查询后在数据表格中显示
  15. 服务器物理内存90%怎么办,服务器物理内存使用率90以上
  16. php 404 not found,404 not found nginx是什么意思
  17. 【Java】基础09
  18. html,css维护优化,网站CSS代码优化的7个原则
  19. 毕业论文怎样写?(三天写出一篇初稿)
  20. 克隆别人的qq空间?

热门文章

  1. 【JavsScript】关于javascript的路线
  2. ASP.NET在类中引用Application和Server.MapPath
  3. art.dialog重设弹窗大小和刷新位置
  4. 虚拟顺丰快递生成器_电商时代|从顺丰优选看,生鲜冷链物流发展面临的问题及解决思路...
  5. (12)FPGA时钟设计原则
  6. (29)Verilog HDL系统函数:$finish
  7. 宝塔linux上传文件视频,使用宝塔linux面板上传文件 解压缩zip和tar.gz
  8. php 获取变量指针_PHP 底层的运行机制与原理
  9. 21. GD32F103C8T6入门教程-flash/fmc连续读写操作
  10. wxpython 基本的控件 (按钮)