大家新年好。博主刚回到广州就要各种忙。博主换了份工作,所以昨天一来到广州就忙着找房子,好在昨晚就已经搞定。时间比较紧迫,这篇文章就直接将如何使用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/insert
uriMatcher.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/update
uriMatcher.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/insert
uriMatcher.addURI(AUTHORITY, "thread_group/insert", THREAD_GROUP_INSERT);
// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group
uriMatcher.addURI(AUTHORITY, "thread_group", THREAD_GROUP_QUERY_ALL);
// content://com.freedom.intelligencesms.provider.GroupContentProvider/thread_group/#
uriMatcher.addURI(AUTHORITY, "thread_group/#", THREAD_GROUP_QUERY);
}
@Override
public boolean onCreate() {
//拿到数据库
mOpenHelper = GroupOpenHelper.getInstance(getContext());
return false;
}
@Override
public 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;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public 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;
}
@Override
public 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;
}
@Override
public 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()//指向最新一条短信
}
}