一、什么是ContentProvider(内容提供者)呢?ContentProvider属于安卓四大组件之一。ContentProvider将访问的方式统一,如数据库、文件等。都可以通过ContentProvider来访问,不必针对不同的数据类型采取不同的访问方式。这样我们就可以控制那些内容,其他程序可以访问,那些内容其他程序不可以访问,即限制了其他程序的访问权限,保证我们的数据安全性。ContentProvider的数据更改可被监听,如:监听信息的变化,通话记录的变化等。我们就可以采取相应的一些操作。

二、怎么创建ContentProvider?分为2步。

1、创建一个类继承ContentProvider(抽象类),重写里面的六个抽象方法

2、在清单文件(AndroidManifest.xml)中注册,在application节点下创建一个provider节点。必须要指定name,authorities属性

name:我们创建类的名称,要写全类名

authorities:一个唯一标示,标示我们这个内容提供者只有一个,一般情况下我们就用域名表示,如:com.51cto.blog.6272409

 
  
  1. static{ 
  2.         UriMatcher.addURI("com.51cto.providers.personprovider", "person", 1); 
  3.         //#在java中代表数字 
  4.         UriMatcher.addURI("com.51cto.providers.personprovider", "person/#", 2); 
  5.          
  6.     } 
 
  
  1. @Override 
  2.     public boolean onCreate() { //当PersonProvider实例被创建之后,系统调用,只调用一次 
  3.         //数据库的初始化操作,一般情况下把数据库的初始放在这个方法里面
  4.         SQLiteOpenHelper msoh = new MySQLiteOpenHelper(this.getContext()); 
  5.         System.out.println("onCreate执行了"); 
  6.         return true
  7.     } 
  8.     @Override 
  9.     public Cursor query(Uri uri, String[] projection, String selection, 
  10.             String[] selectionArgs, String sortOrder) {//可以供外部的应用,查询内容提供者的数据 
  11.         SQLiteDatabase db = msoh.getReadableDatabase(); 
  12.         //判断Uri 通过一个类 UriMatcher 
  13.         switch(MATCHER.match(uri)){ 
  14.             case 1
  15.                 return db.query("person", projection, selection, selectionArgs, nullnull, sortOrder); 
  16.             case 2
  17.                 //通过ContentUris得到id,可以截取uri中的id
  18.                 long id = ContentUris.parseId(uri); 
  19.                 String where = "id="+id; 
  20.                 //判断外面是否有条件传进来 
  21.                 if(selection!=null && !"".equals(selection.trim())){ 
  22.                        where += " and "+selection; 
  23.                 } 
  24.                 return db.query("person", projection, where, selectionArgs, nullnull , sortOrder); 
  25.             default
  26.                 throw new IllegalArgumentException("不是这个"+uri); 
  27.         } 
  28.     } 
  29.  
  30.     @Override 
  31.     public String getType(Uri uri) {//返回要操作的内容类型
  32.         switch(MATCHER.match(uri)){ 
  33.         case 1
  34.             return "vnd.android.cursor.dir/person";//多条数据
  35.         case 2
  36.             return "vnd.android.cursor.item/person";//单条数据
  37.              
  38.         default
  39.             throw new IllegalArgumentException("不是这个"+uri); 
  40.      
  41.         } 
  42.     } 
  43.  
  44.     @Override 
  45.     public Uri insert(Uri uri, ContentValues values) { 
  46.         //得到数据库 
  47.         SQLiteDatabase db = msoh.getWritableDatabase(); 
  48.         //判断Uri 通过一个类 UriMatcher 
  49.         switch(MATCHER.match(uri)){ 
  50.             case 1
  51.                 long rowId = db.insert("person""id", values);//主键值  
  52.                 //工具类   ContentUris.withAppendedId(contentUri, id)将以个id添加到uri中
  53.                 Uri insertUri = ContentUris.withAppendedId(uri, rowId); 
  54.                 this.getContext().getContentResolver().notifyChange(uri, null); 
  55.                 return insertUri; 
  56.                  
  57.             default
  58.                 throw new IllegalArgumentException("不是这个"+uri); 
  59.          
  60.         } 
  61.     } 
  62.  
  63.     @Override 
  64.     public int delete(Uri uri, String selection, String[] selectionArgs) {//放回影响到的记录数 
  65.         //得到数据库 
  66.         SQLiteDatabase db = msoh.getWritableDatabase(); 
  67.         int count = 0
  68.         //判断Uri 通过一个类 UriMatcher 
  69.         switch(MATCHER.match(uri)){ 
  70.             case 1
  71.                  count = db.delete("person", selection, selectionArgs); 
  72.                     this.getContext().getContentResolver().notifyChange(uri, null); 
  73.                 //工具类   ContentUris.withAppendedId(contentUri, id) 
  74.                  break
  75.             case 2
  76.                 //通过ContentUris得到id  
  77.                 long id = ContentUris.parseId(uri); 
  78.                 String where = "id="+id; 
  79.                 //判断外面是否有条件传进来 
  80.                 if(selection!=null && !"".equals(selection.trim())){ 
  81.                        where += " and "+selection; 
  82.                 } 
  83.                 count = db.delete("person", where, selectionArgs); 
  84.                 break
  85.             default
  86.                 throw new IllegalArgumentException("不是这个"+uri); 
  87.         } 
  88.         return count; 
  89.     } 
  90.  
  91.     @Override 
  92.     public int update(Uri uri, ContentValues values, String selection, 
  93.             String[] selectionArgs) { 
  94.         SQLiteDatabase db = msoh.getWritableDatabase(); 
  95.         int count = 0
  96.         //判断Uri 通过一个类 UriMatcher,之前可以调用UriMatcher.addURI();添加一个
  97.         switch(MATCHER.match(uri)){ 
  98.             case 1
  99.                  count = db.update("person", values, selection, selectionArgs); 
  100.                 //工具类   ContentUris.withAppendedId(contentUri, id) 
  101.                  break
  102.             case 2
  103.                 //通过ContentUris得到id  
  104.                 long id = ContentUris.parseId(uri); 
  105.                 String where = "id="+id; 
  106.                 //判断外面是否有条件传进来 
  107.                 if(selection!=null && !"".equals(selection.trim())){ 
  108.                        where += " and "+selection; 
  109.                 } 
  110.                 count = db.update("person", values, where, selectionArgs); 
  111.                 break;       
  112.             default
  113.                 throw new IllegalArgumentException("不是这个"+uri); 
  114.         } 
  115.         return count; 
  116.     }