Android开发之浅谈内容提供者provider的使用
来源:互联网 发布:网络不通怎么解决 编辑:程序博客网 时间:2024/04/27 16:13
大家新年好。博主刚回到广州就要各种忙。博主换了份工作,所以昨天一来到广州就忙着找房子,好在昨晚就已经搞定。时间比较紧迫,这篇文章就直接将如何使用provider了。
内容提供者一般用于进程之间通信,当一个app需要访问另外一个app的数据库内容的时候,就需要用到内容提供者。为了节约时间,博主直接偷懒上代码了,直接拿博主之前写过的一个短信项目来上了。
首先,定义一个内容提供者
package com.freedom.intelligencesms.provider;import com.freedom.intelligencesms.db.GroupOpenHelper;import com.freedom.intelligencesms.utils.SmsUtils;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.text.TextUtils;public class GroupContentProvider extends ContentProvider {//授权地址private static final String AUTHORITY = "com.freedom.intelligencesms.provider.GroupContentProvider";private static final int GROUPS_INSERT = 0;private static final int GROUPS_QUERY_ALL = 1;private static final int GROUPS_UPDATE = 2;private static final int THREAD_GROUP_INSERT = 3;private static final int THREAD_GROUP_QUERY_ALL = 4;private static final int THREAD_GROUP_QUERY = 5;private static final int GROUPS_DELETE = 6;private static UriMatcher uriMatcher;private GroupOpenHelper mOpenHelper;private final String GROUPS_TABLE = "groups";private final String THREAD_GROUP_TABLE = "thread_group";static {//定义一个匹配器uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/inserturiMatcher.addURI(AUTHORITY, "groups/insert", GROUPS_INSERT);// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/uriMatcher.addURI(AUTHORITY, "groups", GROUPS_QUERY_ALL);// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/updateuriMatcher.addURI(AUTHORITY, "groups/update", GROUPS_UPDATE);// content://com.freedom.intelligencesms.provider.GroupContentProvider/groups/delete/#uriMatcher.addURI(AUTHORITY, "groups/delete/#", GROUPS_DELETE);// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/inserturiMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_groupuriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/#uriMatcher.addURI(AUTHORITY, "thread_group/#", THREAD_GROUP_QUERY);}@Overridepublic boolean onCreate() {//拿到数据库mOpenHelper = GroupOpenHelper.getInstance(getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase db = mOpenHelper.getReadableDatabase();switch (uriMatcher.match(uri)) {case GROUPS_QUERY_ALL:if(db.isOpen()) {Cursor cursor = db.query(GROUPS_TABLE, projection, selection, selectionArgs, null, null, sortOrder);cursor.setNotificationUri(getContext().getContentResolver(), SmsUtils.GROUPS_QUERY_ALL_URI);return cursor;}break;case THREAD_GROUP_QUERY_ALL:if(db.isOpen()) {return db.query(THREAD_GROUP_TABLE, projection, selection, selectionArgs, null, null, sortOrder);}break;case THREAD_GROUP_QUERY:if(db.isOpen()) {long id = ContentUris.parseId(uri);String where = "_id = " + id;if(!TextUtils.isEmpty(selection)) {where = selection + " and " + where;}return db.query(THREAD_GROUP_TABLE, projection, where, selectionArgs, null, null, sortOrder);}break;default:throw new IllegalArgumentException("Unknow Uri : " + uri);}return null;}@Overridepublic String getType(Uri uri) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = mOpenHelper.getWritableDatabase();switch (uriMatcher.match(uri)) {case GROUPS_INSERT:if(db.isOpen()) {long id = db.insert(GROUPS_TABLE, null, values);getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);return ContentUris.withAppendedId(uri, id);}break;case THREAD_GROUP_INSERT:if(db.isOpen()) {long id = db.insert(THREAD_GROUP_TABLE, null, values);return ContentUris.withAppendedId(uri, id);}break;default:throw new IllegalArgumentException("Unknow Uri : " + uri);}return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {switch (uriMatcher.match(uri)) {case GROUPS_DELETE:SQLiteDatabase db = mOpenHelper.getWritableDatabase();if(db.isOpen()) {long group_id = ContentUris.parseId(uri);String where = "_id = " + group_id;if(!TextUtils.isEmpty(selection)) {where = selection + " and " + where;}int count = db.delete(GROUPS_TABLE, where, selectionArgs);getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);where = "group_id = " + group_id;db.delete(THREAD_GROUP_TABLE, where, null);return count;}break;default:throw new IllegalArgumentException("Unknow Uri : " + uri);}return 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {switch (uriMatcher.match(uri)) {case GROUPS_UPDATE:SQLiteDatabase db = mOpenHelper.getWritableDatabase();if(db.isOpen()) {int count = db.update(GROUPS_TABLE, values, selection, selectionArgs);getContext().getContentResolver().notifyChange(SmsUtils.GROUPS_QUERY_ALL_URI, null);return count;}break;default:throw new IllegalArgumentException("Unknow Uri : " + uri);}return 0;}}在清单文件中注册:
<provider android:name=".provider.GroupContentProvider" android:authorities="com.freedom.intelligencesms.provider.GroupContentProvider" > </provider>
这样,一个内容提供者就写好了。当我们需要调用的时候。
String path = content://sms/Uri uri = uri.parse(path)ContentResolver resolver = getContentResolver();Cursor cursor = resolver.query(uri。。。。。。。)
有时候,我们需要监听数据库中对应数据变化的时候,这时就需要用到内容观察者。也是直接上使用代码了:
//内容观察者ContentResolver resolver = getContentResolver();resolver.registerContentObserver(uri,true,new MyOberserver(new Handler))private class Myobserver extends ContentObserver{public MyObserver(Handler handler){super(handler)}//当内容观察者发现数据库变化的时候调用这个方法//观察到消息邮箱里面有一个数据变化时,通知public void onChange(boolean selfChange){super.onChange(selfChange);Uri uri = uri.parse("content://sms");ContentResolver resolver = getContentResolver();Cursor cursor = resolver.query(uri,new String[]{"address","date",""type","body"},null,null,null);//从短信数据库获取指定内容while(cursor.moverToNext()){String address = cursor.getString(0)......}//获取所有短信信息cursor.moveToLast()//指向最后一条短信cursor.moveToFirst()//指向最新一条短信}}
0 1
- Android开发之浅谈内容提供者provider的使用
- 【Android 开发】:Content Provider (内容提供者) 详解
- Android开发--内容提供者(Content provider)
- android开发 - Content Provider 内容提供者
- 【Android 开发】:Content Provider (内容提供者) 详解
- Android内容提供者Provider
- Android之内容提供者(Content Provider)
- Android开发之内容提供者
- Android开发之内容提供者
- Android内容提供者(Content provider)
- Android Content Provider(内容提供者)
- Android四大组件之Content Provider(内容提供者)
- Android笔记---四大组件之Content Provider内容提供者详解
- Android四大组件之内容提供者Content Provider总结
- Android之四大组件之一-Content Provider内容提供者的介绍(一)
- Android Content Provider内容提供者的学习笔记
- Android内容提供者(二)创建自己的Provider
- Android 的四大组件Content Provider内容提供者
- 是什么能够两小时写出《flppybird》游戏
- 11g RAC完全安装图解(VM Workstation8.0+Centos5.5)02-Oracle安装
- 用 Python 和 OpenCV 检测图片上的条形码
- 黑马程序员_面向对象(二)
- Could not find the main class: org.apache.catalina.startup.Boostrap. Program will exit
- Android开发之浅谈内容提供者provider的使用
- 编译内核模块 .ko文件缺少:mmzone.h bounds.h
- IOS游戏 与PHP服务器端的AES通讯加密
- 倒入appcompatv7项目各种报错问题汇总
- servlet生命周期,servlet与CGI的区别
- 关于error:Cannot assign to 'self' outside of a method in the init family
- 单元测试——NUnit测试简单实例
- 搜索引擎怎么做历史搜索词记录
- Linux: 使用 google chrome