今天,接触到了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; } }
谢谢大家,请大家多多支持