一、什么是ContentProvider(内容提供者)呢?ContentProvider属于安卓四大组件之一。ContentProvider将访问的方式统一,如数据库、文件等。都可以通过ContentProvider来访问,不必针对不同的数据类型采取不同的访问方式。这样我们就可以控制那些内容,其他程序可以访问,那些内容其他程序不可以访问,即限制了其他程序的访问权限,保证我们的数据安全性。ContentProvider的数据更改可被监听,如:监听信息的变化,通话记录的变化等。我们就可以采取相应的一些操作。
二、怎么创建ContentProvider?分为2步。
1、创建一个类继承ContentProvider(抽象类),重写里面的六个抽象方法
2、在清单文件(AndroidManifest.xml)中注册,在application节点下创建一个provider节点。必须要指定name,authorities属性
name:我们创建类的名称,要写全类名
authorities:一个唯一标示,标示我们这个内容提供者只有一个,一般情况下我们就用域名表示,如:com.51cto.blog.6272409
- static{
- UriMatcher.addURI("com.51cto.providers.personprovider", "person", 1);
- //#在java中代表数字
- UriMatcher.addURI("com.51cto.providers.personprovider", "person/#", 2);
- }
- @Override
- public boolean onCreate() { //当PersonProvider实例被创建之后,系统调用,只调用一次
- //数据库的初始化操作,一般情况下把数据库的初始放在这个方法里面
- SQLiteOpenHelper msoh = new MySQLiteOpenHelper(this.getContext());
- System.out.println("onCreate执行了");
- return true;
- }
- @Override
- public Cursor query(Uri uri, String[] projection, String selection,
- String[] selectionArgs, String sortOrder) {//可以供外部的应用,查询内容提供者的数据
- SQLiteDatabase db = msoh.getReadableDatabase();
- //判断Uri 通过一个类 UriMatcher
- switch(MATCHER.match(uri)){
- case 1:
- return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
- case 2:
- //通过ContentUris得到id,可以截取uri中的id
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- //判断外面是否有条件传进来
- if(selection!=null && !"".equals(selection.trim())){
- where += " and "+selection;
- }
- return db.query("person", projection, where, selectionArgs, null, null , sortOrder);
- default:
- throw new IllegalArgumentException("不是这个"+uri);
- }
- }
- @Override
- public String getType(Uri uri) {//返回要操作的内容类型
- switch(MATCHER.match(uri)){
- case 1:
- return "vnd.android.cursor.dir/person";//多条数据
- case 2:
- return "vnd.android.cursor.item/person";//单条数据
- default:
- throw new IllegalArgumentException("不是这个"+uri);
- }
- }
- @Override
- public Uri insert(Uri uri, ContentValues values) {
- //得到数据库
- SQLiteDatabase db = msoh.getWritableDatabase();
- //判断Uri 通过一个类 UriMatcher
- switch(MATCHER.match(uri)){
- case 1:
- long rowId = db.insert("person", "id", values);//主键值
- //工具类 ContentUris.withAppendedId(contentUri, id)将以个id添加到uri中
- Uri insertUri = ContentUris.withAppendedId(uri, rowId);
- this.getContext().getContentResolver().notifyChange(uri, null);
- return insertUri;
- default:
- throw new IllegalArgumentException("不是这个"+uri);
- }
- }
- @Override
- public int delete(Uri uri, String selection, String[] selectionArgs) {//放回影响到的记录数
- //得到数据库
- SQLiteDatabase db = msoh.getWritableDatabase();
- int count = 0;
- //判断Uri 通过一个类 UriMatcher
- switch(MATCHER.match(uri)){
- case 1:
- count = db.delete("person", selection, selectionArgs);
- this.getContext().getContentResolver().notifyChange(uri, null);
- //工具类 ContentUris.withAppendedId(contentUri, id)
- break;
- case 2:
- //通过ContentUris得到id
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- //判断外面是否有条件传进来
- if(selection!=null && !"".equals(selection.trim())){
- where += " and "+selection;
- }
- count = db.delete("person", where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("不是这个"+uri);
- }
- return count;
- }
- @Override
- public int update(Uri uri, ContentValues values, String selection,
- String[] selectionArgs) {
- SQLiteDatabase db = msoh.getWritableDatabase();
- int count = 0;
- //判断Uri 通过一个类 UriMatcher,之前可以调用UriMatcher.addURI();添加一个
- switch(MATCHER.match(uri)){
- case 1:
- count = db.update("person", values, selection, selectionArgs);
- //工具类 ContentUris.withAppendedId(contentUri, id)
- break;
- case 2:
- //通过ContentUris得到id
- long id = ContentUris.parseId(uri);
- String where = "id="+id;
- //判断外面是否有条件传进来
- if(selection!=null && !"".equals(selection.trim())){
- where += " and "+selection;
- }
- count = db.update("person", values, where, selectionArgs);
- break;
- default:
- throw new IllegalArgumentException("不是这个"+uri);
- }
- return count;
- }