Android学习_ContentProvider和Uri
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()));
Android学习_ContentProvider和Uri的更多相关文章
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- Android – 学习操作NFC – 2
在<Android – 学习操作NFC – 1>说明了Android在处理NFC tag的机制.tag dispatch system的运作流程,以及三种ACTION_NDEF_DISCO ...
- 转--Android学习笔记-实用代码合集
http://blog.csdn.net/yf210yf/article/details/7295577 转载请注明原文出处:奔跑的蜗牛(袁方的技术博客)点击打开链接 一.当利用textview显示内 ...
- 【Android学习】调用系统短信、电话
今天全心投入Android学习已经有一段时间了,从起初的啥也不懂,到现在半知半解状态,随笔记录些简单且常用的系统功能代码. 调用Android系统短信,其实调用短信非常简单,一个方法就可以搞定.我们可 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- Android学习小Demo(19)利用Loader来实时接收短信
之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...
- 最全的android学习资料
一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...
- (转)Android学习-使用Async-Http实现图片压缩并上传功能
(转)Android学习-使用Async-Http实现图片压缩并上传功能 文章转载自:作者:RyaneLee链接:http://www.jianshu.com/p/940fc7ba39e1 让我头疼一 ...
随机推荐
- (转)MySQL数据库命名规范及约定
一.[操作规范]1. 如无备注,则表中的第一个id字段一定是主键且为自动增长:2. 如无备注,则数值类型的字段请使用UNSIGNED属性:3. 如无备注,排序字段order_id在程序中默认使用降序排 ...
- 64位Window操作系统下,Orcal数据访问服务器端和客户端版本对应与通讯问题
最近做一个小系统,需要在客户现场搭建数据库环境.之前我们一直访问的是公司的一个测试库,现在需要在现场开发,现场的Orcal服务器是12C ,我们本不打算重装服务器端orcal,故将我们自己电脑的orc ...
- iOS开发之字典数据建立模型步骤
1. 在控制器属性的(questions)set方法中完成字典转模型的操作 - (NSArray *)questions { if (nil == _questions) { //1.加载plist文 ...
- JavaScript 字符串
字符串属性 属性 描述 constructor 返回创建字符串属性属性的函数 length 返回字符串的长度 prototype 允许您向对象添加属性和方法 字符串方法 Method 描述 charA ...
- MySQL 选择数据库
MySQL 选择数据库 在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库. 从命令提示窗口中选择MySQL数据库 在 mysql> 提示窗口中可以很简 ...
- idea 多模块项目依赖父工程class找不到问题
比如,我们有这么个过程,项目结构如下: a --b --c a是总结点,b是子节点,c是父节点 b依赖父节点class,通过maven构建时通常我们会在子节点中添加父节点依赖,如: <depen ...
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...
- memcache 数据库信息存储到数据库减少IO 操作
在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担.通常会 将 SQL ...
- Python自动化运维之19、Paramiko模块和堡垒机实战
paramiko模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实 ...
- ppt怎么换背景图片|PPT换背景设置方法
PPT怎么换背景?PPT背景可谓是PPT幻灯片的灵魂,优美绚丽的PPT背景能为自己做的PPT幻灯片锦上添花.今天,格子啦小编就教大家PPT换背景的方法,让你不再羡慕别人所做PPT的美丽背景,也可以自己 ...