今天,接触到了ContentProvider,它作为Android的四大组件之一,有着它不可替代的作用。它就像经销商一样经营着手机中每个App的Sqlite数据库,可以让每个App互相获取其他App的数据,在一个App中要想注册一个ContentProvider,必须有一个类继承ContentProvider,并且实现当中的onCreate(),getType(),update(),delete(),query(),insert(),方法,该类所实现的方法能够非常好的实现对Sqlite数据库的增删改查,通知也必须要在AndroidManifast.xml也就是清单文件中注册provider,例如:
<provider
android:name="com.example.provider.DBProvider"
android:authorities="com.example.provider.DBProvider"
android:exported="true" >
</provider>
其中name标签指的是该组件的位置(通常是包名加类名),而authorities则代表着访问该数据库的Uri,而exported属性标签则代表是否暴露出去。
在ContentProvider的子类中的Oncreate()方法我们需要获取一个Sqlite数据库的连接,同时也需要在子类当中编写一个代码块,其作用是编写为ContentProvider添加匹配Uri
例如:
private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
private SQLiteDatabase db;
//添加匹配项
static{
// content://sms--->定位到短信数据所有
//content://联系人/90---》某一条数据
//url 协议:http host:www.baidu.com path:/img
//uri 协议:content:// 域名:AUTHORITY域名 path:/表名
//添加要哦匹配的URI。---》参数1:authority 参数2:资源路径:表名 参数3:该uri匹配成功的返回码code
//完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);
//模糊匹配:id--->#数值
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);
//模糊匹配:name---》*文本
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);
// matcher.match(uri)
}
//实例化ContentProvider的时候调用---》不要做耗时操作
@Override
public boolean onCreate() {
db=new DBHelper(getContext()).getWritableDatabase();
return false;
}
其中“/#”代表通过数字也就是Id匹配,“/*”代表通过字符串匹配,然后是getType()方法,它的作用是通过你所匹配的Uri获取数据的条数来返回字符串
比如当你通过Id来匹配Uri时,你只能获取一条数据那么getType方法就会返回type="vnd.android.cursor.item/vnd."+Uri+"."+表名;
当你通过完整的路劲查询或者是其他属性来查询是,您能获取多条数据那么getType方法会返回type="vnd.android.cursor.dir/vnd."+Uri+"."+表名;
然后是查询方法query,其中参数Uri代表访问的uri,projection代表要查询的列,参数selection代表查询条件,selectionArgs代表查询条件中占位符的值,
sortOrder代表排序
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
在query方法中,我们首先通过UriMatcher对象调用match方法来匹配Uri,从而判断是通过什么来查询
例如:
//把传进来的uri进行匹配---》定位一条数据还是多条数据
int code = matcher.match(uri);
Cursor cursor = null;
switch (code) {
case 1://全部
cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2://指定id
//取出uri中的id
long id = ContentUris.parseId(uri);
cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
break;
case 3://指定name
//取出name值
String name=uri.getLastPathSegment();
//查找条件---》name的值--》模糊匹配
cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);
break;
default:
break;
}
return cursor;
同时delete和update方法也是同query方法一样首先判断匹配uri,然后通过code来进行操作,这里就不一一讲述了
下面就是insert方法了
首先先来段代码
//插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
int code = matcher.match(uri);
Uri withAppendedId =null;
if(code==1){
long id = db.insert(DBHelper.TABLE_NAME, null, values);
withAppendedId = ContentUris.withAppendedId(uri, id);
}
return withAppendedId;
}
这就是ContentProvider的相关代码了,下面是完整代码:
package com.example.day17demo01provider.db;
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;
public class StuProvider extends ContentProvider{
private static final UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
private static final String AUTHORITY = "com.example.day17demo01provider.db.StuProvider";
private SQLiteDatabase db;
//添加匹配项
static{
// content://sms--->定位到短信数据所有
//content://联系人/90---》某一条数据
//url 协议:http host:www.baidu.com path:/img
//uri 协议:content:// 域名:AUTHORITY域名 path:/表名
//添加要哦匹配的URI。---》参数1:authority 参数2:资源路径:表名 参数3:该uri匹配成功的返回码code
//完整路径Uri:content://com.example.day17demo01provider.db.StuProvider/javaScore
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME, 1);
//模糊匹配:id--->#数值
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/#", 2);
//模糊匹配:name---》*文本
matcher.addURI(AUTHORITY, DBHelper.TABLE_NAME+"/*", 3);
// matcher.match(uri)
}
//实例化ContentProvider的时候调用---》不要做耗时操作
@Override
public boolean onCreate() {
db=new DBHelper(getContext()).getWritableDatabase();
return false;
}
//查找数据--->查找SQLite---》SQLiteDataBase
//参数1:uri 参数2:要查找的列 参数4:查找条件 参数5:条件中占位符的值 参数6:排序
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
//把传进来的uri进行匹配---》定位一条数据还是多条数据
int code = matcher.match(uri);
Cursor cursor = null;
switch (code) {
case 1://全部
cursor = db.query(DBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case 2://指定id
//取出uri中的id
long id = ContentUris.parseId(uri);
cursor = db.query(DBHelper.TABLE_NAME, projection, DBHelper.JAVA_ID+" = ?", new String[]{id+""}, null, null, sortOrder);
break;
case 3://指定name
//取出name值
String name=uri.getLastPathSegment();
//查找条件---》name的值--》模糊匹配
cursor=db.query(DBHelper.TABLE_NAME, projection, " name like '%"+name+"%'", null, null, null, sortOrder);
break;
default:
break;
}
return cursor;
}
//获取类型--->name、没有值匹配---》1、3---》多条数据
//2:单条数据
@Override
public String getType(Uri uri) {
String type=null;
int code = matcher.match(uri);
switch (code) {
case 1://多条数据
case 3:
type="vnd.android.cursor.dir/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
break;
case 2:
type="vnd.android.cursor.item/vnd."+AUTHORITY+"."+DBHelper.TABLE_NAME;
break;
default:
break;
}
return type;
}
//插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
int code = matcher.match(uri);
Uri withAppendedId =null;
if(code==1){
long id = db.insert(DBHelper.TABLE_NAME, null, values);
withAppendedId = ContentUris.withAppendedId(uri, id);
}
return withAppendedId;
}
//删除
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int rawNum =0;
int code = matcher.match(uri);
if(code==2){//包含有数值--》id
long id = ContentUris.parseId(uri);//删除条件
//数据库的删除操作
rawNum = db.delete(DBHelper.TABLE_NAME, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
}
return rawNum;
}
//更新
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int code = matcher.match(uri);
switch (code) {
case 1://没有指定name、id
db.update(DBHelper.TABLE_NAME, values, selection, selectionArgs);
break;
case 2://id
//取出id
long id = ContentUris.parseId(uri);
//根据id去更新数
db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_ID+" = ?", new String[]{id+""});
break;
case 3://name
//取出name
String name = uri.getLastPathSegment();
//根据name去更新
db.update(DBHelper.TABLE_NAME, values, DBHelper.JAVA_NAME+" like '%"+name+"%'", null);
break;
default:
break;
}
return 0;
}
}
谢谢大家,请大家多多支持