ContentProvider的使用小结

来源:互联网 发布:js获取当前触发事件 编辑:程序博客网 时间:2024/05/22 22:35
一、什么是ContentProvider?
      ContentProvider是一个抽象类,可以理解为一个特殊的存储数据的类型,它提供了一套标准的接口来获取和操作数据。可以把数据封装到ContentProvider 中,从而是这些数据可以被其他的应用程序所共享。搭建起了所有应用程序之间数据交换的桥梁!

二、ContentProvider的创建过程
1.创建一个类继承ContentProvider
继承它需要实现其所有的抽象方法
 a.onCreate() :初始化该ContentProvider
 b.query(Uri,String[],String,Sring[],String) :通过Uri进行查询,返回Uri
 c.intert(Uri,ContentValues):将数据插入到Uri所指定的位置
 d.update(Uri,ContentValues,String,String []):更新uri指定位置的数据
 e.delete(Uri,String,String[]):删除uri指定位置的数据
 f.getType(Uri):返回数据的类型

2.声明CONTENT_URI,实现UriMatcher
每个ContentProvider都会对外提供一个公共的Uri,当有数据共享的时候,就需要使用ContentProvider为这些数据定义一个Uri,
 UriMatcher是一个用来匹配Uri的工具类
 public static final String AUTHORITY="com.example.provider.students";
 private static final UriMatcher Urimatcher;
 Urimatcher=new UriMatcher(UriMatcher.NO_MATCH);
//添加需要匹配的Uri,匹配则返回相应的匹配码
Urimatcher.addURI(Students.AUTHORITY, "student", STUDENT);
Urimatcher.addURI(Students.AUTHORITY, "student/#", STUDENT_ID);


3.在AndroidManifest.xml中注册
<provider
            android:name=".StudentContentProvider"
            android:authorities="com.example.provider.students"
            />
三、ContentProvider的使用实例
1.常量类,声明需要使用的常量

点击(此处)折叠或打开

  1. package com.example.provider;

  2. import android.net.Uri;
  3. import android.provider.BaseColumns;
  4. /**
  5.  * 
  6.  * @author zt
  7.  *常量类,声明要使用的常量
  8.  *内部类Student实现了BaseColumns接口,该接口也是一个常量接口
  9.  该常量接口中已经定义了_id和_count常量,分别用来表示记录的id和已经记录的数量
  10.  */
  11. public final class Students {
  12.     //定义常量
  13.     public static final String AUTHORITY="com.example.provider.students";
  14.     private Students(){}
  15.     //内部类
  16.     public static final class Student implements BaseColumns{
  17.         private Student(){} //构造方法
  18.         public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/student");
  19.         public static final String CONTENT_TYPE="vnd.android.cursor.dir/vnd.example.provider.students";
  20.         public static final String CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.example.provider.students";
  21.         //数据库中的表字段
  22.         public static final String NMAE="name";//姓名
  23.         public static final String GENDER="gender";//性别
  24.         public static final String AGE="age";//年龄
  25.     }
  26. }

 2.利用数据库帮助类SQLiteOpenHelper来创建数据库
 
 

点击(此处)折叠或打开

  1. package com.example.provider;

  2. import com.example.provider.Students.Student;

  3. import android.content.Context;
  4. import android.database.sqlite.SQLiteDatabase;
  5. import android.database.sqlite.SQLiteOpenHelper;

  6. public class DbHelper extends SQLiteOpenHelper {

  7.     //数据库的名称
  8.     private static final String DATABASE_NAME="student.db";
  9.     private static final int DATABASE_VERSION=1;
  10.     public static final String TABLE_NAME="student";
  11.     
  12.     public DbHelper(Context context) {
  13.         super(context, DATABASE_NAME, null, DATABASE_VERSION);
  14.         
  15.     }
  16.     /**
  17.      * 创建table
  18.      */
  19.     @Override
  20.     public void onCreate(SQLiteDatabase db) {
  21.         //创建学生信息表,包括四个字段
  22.         //包括id、姓名、性别、年龄
  23.         String sql="create table "+TABLE_NAME+" ("
  24.         +Student._ID+" integer primary key,"
  25.         +Student.NMAE+" text,"
  26.         +Student.GENDER+" text,"
  27.         +Student.AGE+" integer "+");";
  28.         db.execSQL(sql);
  29.     }
  30.     /**
  31.      * 更新表
  32.      */
  33.     @Override
  34.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  35.         
  36.         String sql="drop table if exits student";
  37.         db.execSQL(sql);
  38.     }
  39. }
3.创建StudentContentProvider类继承ContentProvider
  



点击(此处)折叠或打开

  1. package com.example.provider;

  2. import java.util.HashMap;

  3. import com.example.provider.Students.Student;

  4. import android.content.ContentProvider;
  5. import android.content.ContentResolver;
  6. import android.content.ContentUris;
  7. import android.content.ContentValues;
  8. import android.content.UriMatcher;
  9. import android.database.Cursor;
  10. import android.database.sqlite.SQLiteDatabase;
  11. import android.net.Uri;
  12. import android.text.TextUtils;

  13. public class StudentContentProvider extends ContentProvider {
  14.     
  15.     //声明数据库帮助类对象
  16.     private DbHelper dbHelper;
  17.     //定义ContentResolver 对象
  18.     private ContentResolver resolver;
  19.     //定义Uri工具类
  20.     private static final UriMatcher Urimatcher;
  21.     //匹配码
  22.     private static final int STUDENT=1;
  23.     private static final int STUDENT_ID=2;
  24.     //需要查询 的列集合
  25.     private static HashMap<String,String> stu;
  26.     //
  27.     
  28.     static
  29.     {
  30.         Urimatcher=new UriMatcher(UriMatcher.NO_MATCH);
  31.         //添加需要匹配的Uri,匹配则返回相应的匹配码
  32.         Urimatcher.addURI(Students.AUTHORITY, "student", STUDENT);
  33.         Urimatcher.addURI(Students.AUTHORITY, "student/#", STUDENT_ID);
  34.         //实例化集合
  35.         stu=new HashMap<String,String>();
  36.         //添加查询列map
  37.         stu.put(Student._ID, Student._ID);
  38.         stu.put(Student.NMAE,Student.NMAE );
  39.         stu.put(Student.GENDER, Student.GENDER);    
  40.         stu.put(Student.AGE,Student.AGE );    
  41.     }
  42.     
  43.     /**
  44.      * 初始化
  45.      */
  46.     @Override
  47.     public boolean onCreate() {
  48.         //创建DbHelper对象
  49.         dbHelper=new DbHelper(getContext());    
  50.         return true;
  51.     }
  52.     /**
  53.      * 查询数据
  54.      */
  55.     @Override
  56.     public Cursor query(Uri uri, String[] projection, String selection,
  57.             String[] selectionArgs, String sortOrder) {
  58.         
  59.         SQLiteDatabase db=dbHelper.getReadableDatabase();
  60.         Cursor cursor;
  61.         switch(Urimatcher.match(uri))
  62.         {
  63.         case STUDENT:
  64.             cursor=db.query(DbHelper.TABLE_NAME,projection , selection, 
  65.                     selectionArgs, null, null, sortOrder);
  66.             break;
  67.         case STUDENT_ID:
  68.             String stuId=uri.getPathSegments().get(1);
  69.             String where="Student._ID="+stuId;
  70.             if(selection!=null&&"".equals(selection.trim()))//trim()函数的功能是去掉首尾空格
  71.             {
  72.                 where+=" and "+selection;
  73.             }
  74.             cursor=db.query(DbHelper.TABLE_NAME, projection, where, selectionArgs, null, null, sortOrder);
  75.             break;
  76.         default:
  77.             //如果传进来的Uri不是我们需要的类型
  78.             throw new IllegalArgumentException("this is Unknown Uri:"+uri);        
  79.         }
  80.         return cursor;
  81.     }
  82.     /**
  83.      * 获得类型
  84.      */
  85.     @Override
  86.     public String getType(Uri uri) {
  87.         
  88.         
  89.         return null;
  90.     }
  91.     /**
  92.      * 插入数据
  93.      */
  94.     @Override
  95.     public Uri insert(Uri uri, ContentValues values) {
  96.         
  97.         //获得可写入的数据库
  98.         SQLiteDatabase db=dbHelper.getWritableDatabase();
  99.         ContentResolver resolver=this.getContext().getContentResolver();
  100.         //插入数据,返回行号ID
  101.         long rowid=db.insert(DbHelper.TABLE_NAME, Student.NMAE, values);
  102.         //如果插入成功,返回Uri
  103.         if(rowid>0)
  104.         {
  105.             Uri stuUri=ContentUris.withAppendedId(uri, rowid);
  106.             resolver.notifyChange(stuUri, null);//数据发送变化时候,发出通知给注册了相应uri的
  107.             return stuUri;
  108.         }
  109.         return null;
  110.     }
  111.     /**
  112.      * 删除数据
  113.      */
  114.     @Override
  115.     public int delete(Uri uri, String selection, String[] selectionArgs) {
  116.             
  117.         SQLiteDatabase db=dbHelper.getWritableDatabase();
  118.         resolver=this.getContext().getContentResolver();
  119.         int count;
  120.         //根据返回的匹配码进行相应的删除动作
  121.         switch(Urimatcher.match(uri))
  122.         {
  123.         case STUDENT:
  124.             count=db.delete(DbHelper.TABLE_NAME, selection, selectionArgs);
  125.             break;
  126.         case STUDENT_ID: //只删除对于的id
  127.             //getPathSegments()方法得到一个String的List
  128.             String stuId=uri.getPathSegments().get(1);
  129.             count=db.delete(DbHelper.TABLE_NAME, Student._ID+"="+stuId+(!TextUtils.isEmpty(selection) ?
  130.                     " and ("+selection+')':""), selectionArgs);
  131.             break;
  132.         default:
  133.             //如果传进来的Uri不是我们需要的类型
  134.             throw new IllegalArgumentException("this is Unknown Uri:"+uri);    
  135.         }
  136.         resolver.notifyChange(uri, null);
  137.         return count;
  138.     }
  139.     /**
  140.      * 更新数据
  141.      */
  142.     @Override
  143.     public int update(Uri uri, ContentValues values, String selection,
  144.             String[] selectionArgs) {
  145.             
  146.         SQLiteDatabase db=dbHelper.getWritableDatabase();//创建一个可读的数据库
  147.         resolver=this.getContext().getContentResolver();
  148.         int count;
  149.         switch(Urimatcher.match(uri))
  150.         {
  151.         case STUDENT:
  152.             count=db.update(DbHelper.TABLE_NAME, values, selection, selectionArgs);
  153.             break;
  154.         case STUDENT_ID:
  155.             String stuId=uri.getPathSegments().get(1);//获得id
  156.             count=db.update(DbHelper.TABLE_NAME, values,Student._ID+"="+stuId+(!TextUtils.isEmpty(selection) ?
  157.                     " and ("+selection+')':""), selectionArgs);
  158.             break;
  159.         default:
  160.             //如果传进来的Uri不是我们需要的类型
  161.             throw new IllegalArgumentException("this is Unknown Uri:"+uri);    
  162.         }
  163.         resolver.notifyChange(uri, null);
  164.         return count;
  165.     }
  166. }

4.创建一个Activity 来测试,查询、删减、插入、更新数据
  

点击(此处)折叠或打开

  1. package com.example.provider;

  2. import com.example.provider.Students.Student;

  3. import android.app.Activity;
  4. import android.content.ContentResolver;
  5. import android.content.ContentUris;
  6. import android.content.ContentValues;
  7. import android.database.Cursor;
  8. import android.net.Uri;
  9. import android.os.Bundle;
  10. import android.util.Log;

  11. public class MyContentProvider extends Activity {
  12.     
  13.     private static final String TAG="MyContentProvider";
  14.     private ContentResolver resolver;
  15.     
  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState)
  18.     {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_main);
  21.         insert();//插入数据
  22.     //    delete(1);//删除第一行
  23.         update(4);
  24.         query();//查询
  25.     }
  26.     //插入数据
  27.     public void insert()
  28.     {
  29.         Uri uri=Student.CONTENT_URI;
  30.         //获得ContentResolver对象
  31.         resolver=this.getContentResolver();
  32.         ContentValues values=new ContentValues();
  33.         //添加学生信息
  34.         values.put(Student.NMAE, "Jack");
  35.         values.put(Student.GENDER, "男");
  36.         values.put(Student.AGE, 20);
  37.         //将信息插入
  38.         resolver.insert(uri, values);
  39.         Log.i(TAG, uri.toString());
  40.     }
  41.     //删除数据
  42.     //删除第id行
  43.     public void delete(Integer id)
  44.     {
  45.         //指定uri
  46.         Uri uri=ContentUris.withAppendedId(Student.CONTENT_URI, id);
  47.         resolver=this.getContentResolver();
  48.         resolver.delete(uri, null, null);
  49.     }
  50.     //更新
  51.     public void update(Integer id)
  52.     {
  53.         Uri uri=ContentUris.withAppendedId(Student.CONTENT_URI, id);
  54.         resolver=this.getContentResolver();
  55.         ContentValues values=new ContentValues();
  56.         values.put(Student.NMAE, "xiaofang");
  57.         values.put(Student.GENDER, "女");
  58.         values.put(Student.AGE, 25);
  59.         resolver.update(uri, values, null, null);
  60.     }
  61.     //查询
  62.     public void query()
  63.     {
  64.         Uri uri=Student.CONTENT_URI;
  65.         String[] PROJECTION=new String[]{
  66.                 Student._ID,
  67.                 Student.NMAE,
  68.                 Student.GENDER,
  69.                 Student.AGE
  70.         };
  71.         resolver=this.getContentResolver();
  72.         Cursor cursor=resolver.query(uri, PROJECTION, null, null, null);
  73.         //判断游标是否为空
  74.         if(cursor.moveToFirst())
  75.         {
  76.             for(int i=0;i<cursor.getCount();i++)
  77.             {
  78.                 cursor.moveToPosition(i);
  79.                 int id=cursor.getInt(0);//获得id
  80.                 String name=cursor.getString(1);//取得姓名
  81.                 String gender=cursor.getString(2);//取得性别
  82.                 int age=cursor.getInt(3);//取得年龄
  83.                 //输出日记
  84.                 Log.i(TAG, "id:"+id+" name:"+name+" gender:"+gender+" age:"+age);
  85.             }
  86.         }
  87.         
  88.     }
  89. }
5.运行模拟器,测试结果如下:



总结:也可以通过其他的应用程序来访问该Activity的数据!
0 0