ContentProvider

一、什么是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 finalclass Students{
  12.     //定义常量
  13.     public staticfinalString AUTHORITY="com.example.provider.students";
  14.     private Students(){}
  15.     //内部类
  16.     public staticfinalclass Studentimplements BaseColumns{
  17.         private Student(){}//构造方法
  18.         public staticfinalUri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/student");
  19.         public staticfinalString CONTENT_TYPE="vnd.android.cursor.dir/vnd.example.provider.students";
  20.         public staticfinalString CONTENT_ITEM_TYPE="vnd.android.cursor.item/vnd.example.provider.students";
  21.         //数据库中的表字段
  22.         public staticfinalString NMAE="name";//姓名
  23.         public staticfinalString GENDER="gender";//性别
  24.         public staticfinalString 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 DbHelperextends SQLiteOpenHelper{

  7.     //数据库的名称
  8.     private staticfinalString DATABASE_NAME="student.db";
  9.     private staticfinalint DATABASE_VERSION=1;
  10.     public staticfinalString TABLE_NAME="student";
  11.    
  12.     public DbHelper(Contextcontext){
  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 StudentContentProviderextends ContentProvider{
  14.    
  15.     //声明数据库帮助类对象
  16.     private DbHelper dbHelper;
  17.     //定义ContentResolver 对象
  18.     private ContentResolver resolver;
  19.     //定义Uri工具类
  20.     private staticfinal UriMatcher Urimatcher;
  21.     //匹配码
  22.     private staticfinalint STUDENT=1;
  23.     private staticfinalint STUDENT_ID=2;
  24.     //需要查询 的列集合
  25.     private staticHashMap<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=newHashMap<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 Cursorquery(Uriuri,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 StringgetType(Uriuri){
  87.        
  88.        
  89.         return null;
  90.     }
  91.     /**
  92.      * 插入数据
  93.      */
  94.     @Override
  95.     public Uriinsert(Uriuri, ContentValuesvalues){
  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 intdelete(Uriuri,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 intupdate(Uriuri, ContentValuesvalues,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 MyContentProviderextendsActivity{
  12.    
  13.     private staticfinalString 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 voidinsert()
  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 voiddelete(Integerid)
  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 voidupdate(Integerid)
  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 voidquery()
  63.     {
  64.         Uri uri=Student.CONTENT_URI;
  65.         String[] PROJECTION=newString[]{
  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. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值