Android应用开发学习笔记之ContentProvider
作者:刘昊昱
博客:http://blog.csdn.net/liuhaoyutz
ContentProvider用于为其它应用程序提供共享数据,它为不同应用程序间共享数据提供了统一的操作接口。
一、ContentProvider的Uri
每个ContentProvider都有对应的Uri,例如,一个自定义的ContentProvider Uri格式如下:
content://authority/path/id
例如:
content://com.liuhaoyu.myprovider/table1/10
1、 content://是“scheme”,Android规定ContentProvider的scheme固定为content://
2、 com.liuhaoyu.myprovider是“authority”,authority用于唯一标识这个ContentProvider,authority一般使用完整的类名来表示,以保证其唯一性。
另外,对于自定义的ContentProvider,还需要在AndroidManifest.xml中指定authority对ContentProvider进行唯一标识。例如:
<manifest.... >
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<provider android:name=".MyContentProvider"
android:authorities="com.liuhaoyu.myprovider"/>
</application>
</manifest>
3、 authority之后的部分,表示我们要操作的数据,包括“path”和“id”,具体包括几个字段,应该根据需要而定。例如:
要操作table2表中的所有记录,则路径为table2
要操作table2表中的ID为2的记录,则路径为table2/2
要操作table2表中的ID为2的记录的name字段,则路径为table2/2/name
如果要把字符串转换为Uri,可以使用Uri.parse()函数,例如:
Uri uri = Uri.parse(“content://com.liuhaoyu.myprovider/table1/10/name”);
二、Uri的辅助类
因为Uri会经常用到,所以Android提供了两个Uri辅助类UriMatcher和ContentUris。UriMatcher用于对Uri进行匹配,ContentUris用于对Uri的ID部分进行操作。
先来通过一个例子看UriMatcher的用法:
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
sMatcher.addURI("com.liuhaoyu.myprovider","person", 1);
sMatcher.addURI("com.liuhaoyu.myprovider","person/#", 2);//#号为通配符
switch (sMatcher.match(Uri.parse("content://com.liuhaoyu.myprovider/person/10"))){
case 1
break;
case 2
break;
default:
break;
}
首先通过UriMatcher.addURI()对URI进行注册。以后就可以使用UriMatcher.match()对要处理的Uri进行匹配,如果匹配成功,返回注册的返回码。
ContentUris类有两个比较实用的方法:
ContentUris.withAppendedId()函数用于将ID添加到路径后面。
Uri uri = Uri.parse("content://com.liuhaoyu.myprovider/table1")
Uri resultUri = ContentUris.withAppendedId(uri,1);
生成的resultUri为:content://com.liuhaoyu.myprovider/1
ContentUris.parseId()函数用于从Uri中分析出ID。
Uri uri =Uri.parse("content://com.ljq.provider.personprovider/person/10")
long personid = ContentUris.parseId(uri);//获取的结果为:10
三、预定义ContentProvider
Android提供了一些预定义的ContentProvider,包括声音、图片、视频、联系人等等,它们大多数位于android.provider包中,下面列出一些常用的预定义ContentProvider:
Borwser:书签、浏览历史、搜索历史
CallLog:通话历史
Contacts:联系人
MediaStore:声音、视频、图片
四、自定义ContentProvider
若要定义自己的ContentProvider,需要完成以下操作:
(1)、建立数据存储系统。大多数ContentProvider使用Android文件存储方式或者SQlite数据库保存数据,但是开发者可以使用任何方式存储数据。Android提供了SQLiteOpenHelper类帮助创建数据库,SQLiteDatabase类帮助管理数据库。
(2)、继承ContentProvider类来提供数据访问接口。一般需要实现ContentProvider类的如下成员函数:
public class PersonContentProvider extendsContentProvider{
public boolean onCreate()
public Uri insert(Uri uri, ContentValues values)
public int delete(Uri uri, String selection, String[] selectionArgs)
public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs)
public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)
public String getType(Uri uri)
}
(3)、在应用程序的AndroidManifest.xml文件中声明ContentProvider。例如:
<manifest.... >
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
<provider android:name=".MyContentProvider"
android:authorities="com.liuhaoyu.myprovider"/>
</application>
</manifest>
五、使用ContentResolver
ContentProvider内部如何保存数据由其设计者决定,但是所有的ContentProvider都实现了一组通用的方法,用来对数据进行增、删、改、查。其它应用程序对ContentProvider进行操作时,并不会直接调用ContentProvider实现的方法,而是通过ContentResolver类实现对ContentProvider的操作。
可以通过Activity.getContentResolver()函数获取ContentResolver对象。
ContentResolver类提供了对ContentProvider进行增、删、改、查的相应函数,具体可参考官方文档。
六、监听ContentProvider的变化
若访问者要监听ContentProvider的变化,可以使用ContentResolver.registerContentObserver()注册一个ContentObserver对象对指定ContentProvider进行监听,如果ContentProvider的数据发生了变化,则ContentObserver.onChange()方法会被调用,可以在该函数中进行相应处理。
而在ContentProvider这边,当其中的数据发生变化时,需要调用ContentResolver.notifyChange()函数通知注册的ContentObserver。
七、应用举例
下面来看一个使用预定义的ContentProvider的例子,该程序运行效果如下:
先来看主布局文件,其内容如下:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="25dp" /> </LinearLayout>
下面看主Activity文件,其内容如下:
package com.liuhaoyu; import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
importandroid.provider.ContactsContract.Contacts;
importandroid.provider.ContactsContract.CommonDataKinds.Phone;
import android.widget.TextView; public class MainActivity extends Activity{
private String[] columns = { Contacts._ID,
Contacts.DISPLAY_NAME,
Phone.NUMBER,
Phone.CONTACT_ID, }; public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.result);
tv.setText(getQueryData());
} private String getQueryData() { StringBuilder sb = new StringBuilder();
ContentResolver resolver =getContentResolver();
Cursor cursor =resolver.query(Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
int idIndex =cursor.getColumnIndex(columns[0]);
int displayNameIndex =cursor.getColumnIndex(columns[1]);
int id = cursor.getInt(idIndex);
String displayName = cursor.getString(displayNameIndex);
Cursor phone =resolver.query(Phone.CONTENT_URI, null, columns[3] + "=" + id, null,null);
while (phone.moveToNext()) {
int phoneNumberIndex =phone.getColumnIndex(columns[2]);
String phoneNumber =phone.getString(phoneNumberIndex);
sb.append(displayName + ":" + "\n" + phoneNumber + "\n");
}
}
cursor.close();
return sb.toString();
}
}
Android应用开发学习笔记之ContentProvider的更多相关文章
- Android应用开发学习笔记之播放音频
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android支持常用音视频格式文件的播放,本文我们来学习怎样开发Android应用程序对音视频进行操作. Andr ...
- android移动开发学习笔记(二)神奇的Web API
本次分两个大方向去讲解Web Api,1.如何实现Web Api?2.如何Android端如何调用Web Api?对于Web Api是什么?有什么优缺点?为什么用WebApi而不用Webservice ...
- Android应用开发学习笔记之事件处理
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...
- Android应用开发学习笔记之Intent
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Intent是什么呢?来看Android官网上的定义: An intent is an abstractdescri ...
- Android应用开发学习笔记之AsyncTask
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 在上一篇文章中我们学习了多线程和Handler消息处理机制,如果有计算量比较大的任务,可以创建一个新线程执行计算工作 ...
- [Android游戏开发学习笔记]View和SurfaceView
本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...
- Android应用开发学习笔记之Fragment
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Fragment翻译成中文就是“碎片”.“片断”的意思,Fragment通常用来作为一个Activity用户界面的一 ...
- Android应用开发学习笔记之菜单
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android中的菜单分为选项菜单(OptionMenu)和上下文菜单(Context Menu).通常使用菜单资源 ...
- Android应用开发学习笔记之多线程与Handler消息处理机制
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...
随机推荐
- 开源的Android视频播放器
之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...
- c# 课堂总结6 --集合与结构体
一.集合 使用时必须添加 System.Collections 集合与数组的区别: 1:数组声明了它容纳的元素的类型,而集合不声明.这是由于集合以object形式来存储它们的元素.初始化时集合无需定义 ...
- 算法之旅,直奔<algorithm>之十 count_if
count_if(vs2010) 引言 这是我学习总结<algorithm>的第十篇,这个重要的地方是设置条件.用的还是蛮多的.(今天下午挺恶心的,一下午就做一个面试题,调代码调傻了... ...
- html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题
一.背景 使用ajax,可以实现不需要刷新整个页面就可以进行局部页面的更新.这样可以开发交互性很强的富客户端程序,减少网络传输的内容.但长期以来存在一个问题,就是无法利用浏览器本身提供的前进和后退按钮 ...
- 用PowerMockito来mock私有方法(转)
话说我们做的所谓的接口测试真的是不伦不类啊,测的是controller层,那叫接口木??!!可是老大们说写的是接口测试,那就接口吧! 自接手写这个接口测试不久,很多人,包括一个关系比较好的架构师就跟我 ...
- 在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编
在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...
- windows安装Apache,注册服务出现“(OS 5)拒绝访问。 : AH00369: Failed to open the WinNT service manager..."错误
原文:http://blog.csdn.net/jaray/article/details/9950211 在安装Apache的时候,我下载的是zip格式,不是msi安装版,需要自己注册服务,才能在桌 ...
- hdu 4614 Vases and Flowers (二分 线段树)
题目大意:爱丽丝有N个花瓶,每个花瓶最多放一朵花.然后又如下两个操作. 1:A B 从第A个花瓶开始,往后依次插B朵花,直到不能插为止.如果一朵花都不能插入就输出“can.....”,否则输出第 ...
- Bernstein polynomials
Bernstein多项式能够用来一致逼近闭区间上的连续函数. 对于[0,1]上的连续函数f(x),定义Bernstein多项式 B_n(f,x) = sum{k=0..n} f(k/n)C(k,n)t ...
- 微信或手机浏览器在线显示office文件(已測试ios、android)
近期开发微信企业号,发现微信andriod版内置浏览器在打开文件方面有问题,可是ios版没有问题.原因是ios版使用的是safari浏览器 支持文档直接打开.可是andriod版使用的是腾讯浏览器x5 ...