ContentProvider做为四大组件之一,他的地位不容忽视。它的做用是为不一样应用程序数据共享,提供统一接口 咱们其余应用程序要调用android系统中的应用,这时候就要用到ContentProvider,也能够咱们利用ContentProvider编写本身的内容提供者,供其余应用使用android
ContentProvider经过URI惟一标识其余要访问的数据,开发人员通常经过ContentResolver来进行操做ContentProvider,可进行增删改查实现对数据的共享。git
ContentProvider是一个抽象类,若是要开发本身的内容提供者都要继承这个类并进行重写。主要实现如下方法:github
public boolean onCreate() |
在建立ContentProvider的时候进行调用sql
public Cursor query() |
用来查询指定的URI返回一个Cursor数据库
public Uri insert() |
向指定RUI的ContentProvider中插入数据bash
public int update() |
用户更新指定的RUI的数据ide
public int delete() |
用户删除指定的RUI的数据ui
public String getType() |
用于返回指定的Uri中的数据MIME类型this
咱们建立一个数据库的ContentProvider类来实现数据共享,自定义名称为MyProviderspa
package com.haolin.contentprovider.sample;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class MyProvider extends ContentProvider {
private Context mContext;
DBHelper mDbHelper = null;
SQLiteDatabase db = null;
public static final String AUTOHORITY = "com.haolin.contentprovider.sample.MyProvider";
// 设置ContentProvider的惟一标识
public static final int User_Code = 1;
public static final int Job_Code = 2;
// UriMatcher类使用:在ContentProvider 中注册URI
private static final UriMatcher mMatcher;
static{
mMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 初始化
mMatcher.addURI(AUTOHORITY,"user", User_Code);
mMatcher.addURI(AUTOHORITY, "job", Job_Code);
}
// 如下是ContentProvider的6个方法
/**
* 初始化ContentProvider
*/
@Override
public boolean onCreate() {
mContext = getContext();
// 在ContentProvider建立时对数据库进行初始化
// 运行在主线程,故不能作耗时操做,此处仅做展现
mDbHelper = new DBHelper(getContext());
db = mDbHelper.getWritableDatabase();
// 初始化两个表的数据(先清空两个表,再各加入一个记录)
db.execSQL("delete from user");
db.execSQL("insert into user values(1,'Carson');");
db.execSQL("insert into user values(2,'Kobe');");
db.execSQL("delete from job");
db.execSQL("insert into job values(1,'Android');");
db.execSQL("insert into job values(2,'iOS');");
return true;
}
/**
* 添加数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名
// 该方法在最下面
String table = getTableName(uri);
// 向该表添加数据
db.insert(table, null, values);
// 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)
mContext.getContentResolver().notifyChange(uri, null);
// // 经过ContentUris类从URL中获取ID
// long personid = ContentUris.parseId(uri);
// System.out.println(personid);
return uri;
}
/**
* 查询数据
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名
// 该方法在最下面
String table = getTableName(uri);
// 查询数据
return db.query(table,projection,selection,selectionArgs,null,null,sortOrder,null);
}
/**
* 更新数据
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// 因为不展现,此处不做展开
return 0;
}
/**
* 删除数据
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// 因为不展现,此处不做展开
return 0;
}
@Override
public String getType(Uri uri) {
// 因为不展现,此处不做展开
return null;
}
/**
* 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名
*/
private String getTableName(Uri uri){
String tableName = null;
switch (mMatcher.match(uri)) {
case User_Code:
tableName = DBHelper.USER_TABLE_NAME;
break;
case Job_Code:
tableName = DBHelper.JOB_TABLE_NAME;
break;
}
return tableName;
}
}
复制代码
<provider
android:authorities="com.haolin.contentprovider.sample.MyProvider"
android:name=".MyProvider"
android:exported="true"/>
复制代码
这里的authorities惟一标识该内容提供者,这样其它的应用才能够找到该内容提供者并操做它的数据;exported为true当前内容提供者能够被其它应用使用,默认为true
咱们在MainActivity中来操做ContentProvider数据 或者新建个项目也可直接操做
/*
* 对user表进行操做
*/
// 设置URI
Uri uri_user = Uri.parse("content://com.haolin.contentprovider.sample.MyProvider/user");
// 插入表中数据
ContentValues values = new ContentValues();
values.put("_id", 3);
values.put("name", "Iverson");
// 获取ContentResolver
ContentResolver resolver = getContentResolver();
// 经过ContentResolver 根据URI 向ContentProvider中插入数据
resolver.insert(uri_user,values);
// 经过ContentResolver 向ContentProvider中查询数据
Cursor cursor = resolver.query(uri_user, new String[]{"_id","name"}, null, null, null);
assert cursor != null;
while (cursor.moveToNext()){
System.out.println("query book:" + cursor.getInt(0) +" "+ cursor.getString(1));
// 将表中数据所有输出
}
cursor.close();
// 关闭游标
/*
* 对job表进行操做
*/
// 和上述相似,只是URI须要更改,从而匹配不一样的URI CODE,从而找到不一样的数据资源
Uri uri_job = Uri.parse("content://com.haolin.contentprovider.sample.MyProvider/job");
// 插入表中数据
ContentValues values2 = new ContentValues();
values2.put("_id", 3);
values2.put("job", "NBA Player");
// 获取ContentResolver
ContentResolver resolver2 = getContentResolver();
// 经过ContentResolver 根据URI 向ContentProvider中插入数据
resolver2.insert(uri_job,values2);
// 经过ContentResolver 向ContentProvider中查询数据
Cursor cursor2 = resolver2.query(uri_job, new String[]{"_id","job"}, null, null, null);
assert cursor2 != null;
while (cursor2.moveToNext()){
System.out.println("query job:" + cursor2.getInt(0) +" "+ cursor2.getString(1));
// 将表中数据所有输出
}
cursor2.close();
// 关闭游标
复制代码
这样咱们能够对ContentProvider进行增删改查等操做。
注册ContentObserver来监听对应uri的数据变化,这步不是必须的,若是不须要监听数据变化也能够不注册
首先获取ContentResolver对象 getContentResolver()
在进行注册Observer resolver.registerContentObserver(uri_user,true,new TestContentObs(handler));
咱们须要建立个类继承ContentObserver
package com.haolin.contentprovider.testcontentprovider;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
/**
* 做者:haoLin_Lee on 2019/05/12 12:18
* 邮箱:Lhaolin0304@sina.com
* class:
*/
public class TestContentObs extends ContentObserver {
Handler handler;
public TestContentObs(Handler handler) {
super(handler);
this.handler = handler;
}
@Override
public void onChange(boolean selfChange, Uri uri) {
super.onChange(selfChange, uri);
Message message = Message.obtain();
message.obj = uri;
handler.sendMessage(message);
}
}
复制代码
若是数据库内容有更新,ContentObserver在收到数据变化的通知后经过Handler机制来通知主线程更新UI
给个赞呗 有问题及时反馈,谢谢你们
关注我 GitHub