sharedpreferences和文件虽然都能实现数据共享,但是却无法实现数据库的共享,所以android提供了contentProvider的方法来实现数据库的共享,下面就来介绍contentprovider
1.contentprovider的目的是为了实现数据的共享,为了使用contentprovider就需要先重写其中的4种方法oncreate,insert,delete,query, oncreate为创建时调用的方法,insert为插入数据时的方法,delete未删除数据时的方法,query为查询时使用的方法。这几个方法是必须实现的,原始方法如下:

public boolean onCreate():
//insert第一个参数为uri,第二个参数为要插入的值
public Uri insert(Uri uri, ContentValues values)
//delete第一个参数为uri,第二个参数为sql语句的选择条件,第三个参数为当selection参数中有占位符时,取值从第三个参数中获取
public int delete(Uri uri, String selection, String[] selectionArgs)
//数据更新,参数与delete是一致的
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
//查询函数第一个参数是uri,第二个参数为返回的项目即select 与from之前的这一部分,三,四参数和上面一致,第五个参数是排序方式
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
//返回数据的mime类型
public String getType(Uri uri)

2.contentprovider使用的关键Universal Resource Identifier,简写为URI,方便的理解方式为web开发中的url类似的概念,就是提供数据的访问“链接”,分三部分组成,”content://”,数据路径,ID标志符,android提供了两个用以操作uri的类UriMatcher 和ContentUris 。
一,UriMatcher
UriMatcher的主要作用是用来初始化Uri
初始化方法如下,第一步:

UriMatcher sMatcher=new UriMatcher(UriMatcher.NO_MATCH);;

第二步,注册所需的URI,第一个参数为authorities,第二个参数为路径,第三个参数为匹配码,是之后用来进行uri匹配时用到的值

sMatcher.addURI("com.example.ui_demo","mytable", 1);
             sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);

第三步,URI匹配

Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10"); 
 switch (sMatcher.match(uri)) {
         case 1:
                 //匹配码为1时的操作
         case 2:
                 //匹配码为2时的操作
         default:
                 throw new IllegalArgumentException("Unknown URI"+uri);
         }

二,ContentUris是用来从给定的uri中获取ID,或是添加ID用
1.为路径加上ID

Uri uri = Uri.parse("content://com.example.ui_demo/mytable");
 Uri noteUri=ContentUris.withAppendedId(ur, 10);

则此时的URI为”content://com.example.ui_demo/mytable/10”
2.获取路径ID

Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10");
long id=ContentUris.parseId(uri);

此时获取的ID值为10

三,实际使用时并不是直接使用contentProvider来操作数据,而是通过contentResolver来供外部应用操作contentProvider中的数据,实际的调用ContentProvider是在contentResolver的使用中进行的,而ContentProvider和ContenResolver是怎么关联起来的,可以参考下面的博客,博主写的很全面

四,完整的运用过程如下
1.创建一个数据库供contentprovider使用,这个在上一篇中有详细介绍,这里就不多说了
2.注册contentprovider
提供provider的程序,注意provider的注册需要卸载application内,而权限的注册需要放在之外

<permission android:name="com.example.ui_demo.dataprovider.READ_DATABASE" />
    <permission android:name="com.example.ui_demo.dataprovider.WRITE_DATABASE" />
<provider android:name=".dataprovider" 
             android:authorities="com.example.ui_demo"
              android:exported="true"
             android:readPermission="com.example.ui_demo.dataprovider.READ_DATABASE"
             android:writePermission="com.example.ui_demo.dataprovider.WRITE_DATABASE"></provider>

要使用provider的应用程序定义在application之外

<uses-permission android:name="com.example.ui_demo.dataprovider.READ_DATABASE"/>
     <uses-permission android:name="com.example.ui_demo.dataprovider.WRITE_DATABASE"/>

3.注册完毕后,就是重写contentprovider的方法了,重写过程如下

public class dataprovider extends ContentProvider {
    //删除considerprovider数据
     private final static String tag="ContentProvider";
     private datasave database;
     private SQLiteDatabase mydata=null;
     private static final UriMatcher sMatcher;
     static{
             sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
             sMatcher.addURI("com.example.ui_demo","mytable", 1);
             sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);

     }
     //构造函数,获得上下文
    @Override
    public int delete(Uri uri, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
           Log.i(tag,"start delete provider data");
           mydata= database.getDataBase();
           int count = 0;
           switch (sMatcher.match(uri)) {
           case 1:
                   count =  mydata.delete("mytable",arg1, arg2);
                   break;
           case 2:
                  long id=ContentUris.parseId(uri);
                  String where="ID="+id;
                  count= mydata.delete(table.TNAME,where,arg2);
                  break;
           }
           getContext().getContentResolver().notifyChange(uri, null);
           return count;
    }
    //获取considerprovider数据类型
    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        Log.i(tag,"start get provider type");
         switch (sMatcher.match(uri)) {
         case 1:
                 return table.CONTENT_TYPE;
         case 2:
                 return table.CONTENT_ITEM_TYPE;
         default:
                 throw new IllegalArgumentException("Unknown URI"+uri);
         }
    }
    //插入considerprovider数据
    @Override
    public Uri insert(Uri uri, ContentValues value) {
        // TODO Auto-generated method stub
        Log.i(tag,"start insert provider data");
        mydata=database.getDataBase();
         switch (sMatcher.match(uri)) {
         case 1:

              Log.i(tag,"start insert  data");
              try{
              mydata.insert(table.TNAME, null, value);//返回第几行
              }catch(Exception e){
                  Log.i(tag,e.getMessage());
              }
              long id=(Integer) value.get("ID");
              Uri ur=Uri.parse("content://com.example.ui_demo/mydata");
                  //添加id
               Uri noteUri=ContentUris.withAppendedId(ur, id);
              this.getContext().getContentResolver().notifyChange(noteUri, null);
               return noteUri;



         default:
                 throw new IllegalArgumentException("Unknown URI"+uri);
         }
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        Log.i(tag,"start create provider");
        //打开数据库,参数上下文,数据库名,工厂类,数据库版本
        database=new datasave(this.getContext());
        database.create("mytable");
        return false;
    }
    //获取considerprovider数据
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        // TODO Auto-generated method stub
        Log.i(tag,"start query provider data");
        mydata=database.getDataBase();  
        Cursor cur=null;
         switch (sMatcher.match(uri)) {
         case 1:
               Log.i(tag,"start query mytable provider data");        
               cur=mydata.query(table.TNAME,projection,selection,selectionArgs,null,null,null);
               break;

         case 2:
             long id = ContentUris.parseId(uri);  
             Log.i(tag,"start query mytable id provider data"+id); 
             String sql="select * from mytable where ID ="+id;
             //String where = "ID=" + id; 
            // cur=mydata.query(table.TNAME,projection,where,selectionArgs,null,null,null);
             cur=mydata.rawQuery(sql, new String[]{});
             break;
         default:
                 throw new IllegalArgumentException("Unknown URI1"+uri);
         }
         return cur;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        Log.i(tag,"start update provider data");
        return 0;
    }
    }

4.通过contentResolver来操作数据

contentResolver=ShareDemo.this.getContentResolver();//获取对象
Cursor cur=null;
         try{
             cur=contentResolver.query(uri, null, null, null, null);
            }catch(Exception e){
                Log.i("ContentProvider",e.getMessage());
            }
        while(cur.moveToNext()){
            //Toast.makeText(this,cur.getString(1)+"ok1", Toast.LENGTH_LONG).show();
            list.add(cur.getString(0));
            list.add(cur.getString(1));
            //Toast.makeText(this,cur.getString(0)+"ok", Toast.LENGTH_LONG).show();

        }
        listshow showlist=new listshow(ShareDemo.this,list);
         showlist.show();

示例代码
dataprovider.java

package com.example.ui_demo;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

public class dataprovider extends ContentProvider {
    //删除considerprovider数据
     private final static String tag="ContentProvider";
     private Context context;
     private datasave database;
     private SQLiteDatabase mydata=null;
     private static final UriMatcher sMatcher;
     static{
             sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
             sMatcher.addURI("com.example.ui_demo","mytable", 1);
             sMatcher.addURI("com.example.ui_demo","mytable"+"/#", 2);

     }
     //构造函数,获得上下文
    @Override
    public int delete(Uri uri, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
           Log.i(tag,"start delete provider data");
           mydata= database.getDataBase();
           int count = 0;
           switch (sMatcher.match(uri)) {
           case 1:
                   count =  mydata.delete("mytable",arg1, arg2);
                   break;
           case 2:
                  long id=ContentUris.parseId(uri);
                  String where="ID="+id;
                  count= mydata.delete(table.TNAME,where,arg2);
                  break;
           }
           getContext().getContentResolver().notifyChange(uri, null);
           return count;
    }
    //获取considerprovider数据类型
    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        Log.i(tag,"start get provider type");
         switch (sMatcher.match(uri)) {
         case 1:
                 return table.CONTENT_TYPE;
         case 2:
                 return table.CONTENT_ITEM_TYPE;
         default:
                 throw new IllegalArgumentException("Unknown URI"+uri);
         }
    }
    //插入considerprovider数据
    @Override
    public Uri insert(Uri uri, ContentValues value) {
        // TODO Auto-generated method stub
        Log.i(tag,"start insert provider data");
        mydata=database.getDataBase();
         switch (sMatcher.match(uri)) {
         case 1:

              Log.i(tag,"start insert  data");
              try{
              mydata.insert(table.TNAME, null, value);//返回第几行
              }catch(Exception e){
                  Log.i(tag,e.getMessage());
              }
              long id=(Integer) value.get("ID");
              Uri ur=Uri.parse("content://com.example.ui_demo/mydata");
                  //添加id
               Uri noteUri=ContentUris.withAppendedId(ur, id);
              this.getContext().getContentResolver().notifyChange(noteUri, null);
               return noteUri;



         default:
                 throw new IllegalArgumentException("Unknown URI"+uri);
         }
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        Log.i(tag,"start create provider");
        //打开数据库,参数上下文,数据库名,工厂类,数据库版本
        database=new datasave(this.getContext());
        database.create("mytable");
        return false;
    }
    //获取considerprovider数据
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        // TODO Auto-generated method stub
        Log.i(tag,"start query provider data");
        mydata=database.getDataBase();  
        Cursor cur=null;
         switch (sMatcher.match(uri)) {
         case 1:
               Log.i(tag,"start query mytable provider data");        
               cur=mydata.query(table.TNAME,projection,selection,selectionArgs,null,null,null);
               break;

         case 2:
             long id = ContentUris.parseId(uri);  
             Log.i(tag,"start query mytable id provider data"+id); 
             String sql="select * from mytable where ID ="+id;
             //String where = "ID=" + id; 
            // cur=mydata.query(table.TNAME,projection,where,selectionArgs,null,null,null);
             cur=mydata.rawQuery(sql, new String[]{});
             break;
         default:
                 throw new IllegalArgumentException("Unknown URI1"+uri);
         }
         return cur;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        Log.i(tag,"start update provider data");
        return 0;
    }
    //数据库类
    public static class datasave{
        private SQLiteDatabase dbase=null;
        public datasave(Context context){
            //打开数据库 
            Log.i(tag,"open or create database");
            try{
                 dbase=context.openOrCreateDatabase("mydata.db",Context.MODE_PRIVATE, null);
            }catch(Exception e){
                Log.i(tag,e.getMessage());
            }
        }
        //创建表
        public void create(String TableName){
            Log.i(tag,"create table if not exists");
            try{
              String create="CREATE TABLE"+" IF NOT EXISTS "+TableName+" (ID INTEGER,NAME TEXT)";
              dbase.execSQL(create);
            }catch(Exception e){
                Log.i(tag,e.getMessage());
            }
        }

        public void insert(String TableName,String []selections){
            Log.i(tag,"insert table data");
            try{
              String insert="insert into "+TableName+" values(selections[0],selections[1]);";
              dbase.execSQL(insert);
            }catch(Exception e){
                Log.i(tag,e.getMessage());
            }
        }
        public void delete(String TableName){
            Log.i(tag,"delete table data");
            try{
              String delete="DROP TABLE"+TableName;
              dbase.execSQL(delete);
            }catch(Exception e){
                Log.i(tag,e.getMessage());
            }
        }
        public SQLiteDatabase getDataBase(){
            return this.dbase;
        }
    }
      public static class table {

        public static final String DBNAME = "mydata.db"; 
        public static final String TNAME = "mytable";
        public static final int VERSION = 3;

        public static final String TID = "tid";
        public static final String ID = "ID";
        public static final String NAME = "NAME";


        public static final String AUTOHORITY = "com.example_ui.demo";
        public static final int ITEM = 1;
        public static final int ITEM_ID = 2;
        //匹配类型,如为MME类型返回CONTENT_TYPE,反之返回ITEM_TYPE 
        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/mytable";
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/mytable";

        public static final Uri uri = Uri.parse("content://" + AUTOHORITY + "/mytable");
      }
}

readotherdatabase.java

package com.example.readotherdatabase;

import java.util.ArrayList;
import java.util.List;


import android.app.Activity;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
    private TableLayout table=null;
    private ContentResolver contentResolver;
    private List<String> list=new ArrayList<String>();
    private SQLiteDatabase mydata;
    private ListView listshow;
    private String []mysql={"读取","读取(ID)","删除","插入"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        table=(TableLayout)this.findViewById(R.id.item);
        contentResolver=MainActivity.this.getContentResolver();
        listshow=(ListView)this.findViewById(R.id.listshowc);
        //Uri uri = Uri.parse("content://com.example.ui_demo/mytable");  

        myadapter m=new myadapter(this);
        listshow.setAdapter(m);
    }
    public void updataview(Uri uri){
        Cursor cur=null;
         try{
             cur=contentResolver.query(uri, null, null, null, null);
            }catch(Exception e){
                Log.i("ContentProvider",e.getMessage());
            }
        while(cur.moveToNext()){
            //Toast.makeText(this,cur.getString(1)+"ok1", Toast.LENGTH_LONG).show();
            list.add(cur.getString(0));
            list.add(cur.getString(1));
            //Toast.makeText(this,cur.getString(0)+"ok", Toast.LENGTH_LONG).show();

        }
        listshow showlist=new listshow(MainActivity.this,list);
         showlist.show();

    }
     public class myadapter extends BaseAdapter{
            private Context context;
            public myadapter(Context context){
                this.context=context;
            }
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return mysql.length;
            }

            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }

            @Override
            public View getView(int position, View vi, ViewGroup vg) {

                // TODO Auto-generated method stub
                Button button=new Button(MainActivity.this);
                button.setText(mysql[position]);
                button.setId(position);
                buttonclick m=new buttonclick();
                button.setOnClickListener(m);

                return button;
            }
     }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public class buttonclick implements OnClickListener{
        private int i=0;
        @Override
        public void onClick(View vi) {
            // TODO Auto-generated method stub
            if(vi.getId()==0){
                //查询表
                Uri uri = Uri.parse("content://com.example.ui_demo/mytable"); 
                updataview(uri);




            }else if(vi.getId()==1){
                //读取带ID
                Uri uri = Uri.parse("content://com.example.ui_demo/mytable/10"); 
                updataview(uri);
            }else if(vi.getId()==2){
                Uri uri=Uri.parse("content://com.example.ui_demo/mytable/11");
                contentResolver.delete(uri, null, null);
                uri = Uri.parse("content://com.example.ui_demo/mytable"); 
                updataview(uri);
            }else if(vi.getId()==3){
                Uri uri=Uri.parse("content://com.example.ui_demo/mytable");
                ContentValues value=new ContentValues();
                value.put("ID",11);
                value.put("NAME","lianggong zhazha");
                contentResolver.insert(uri, value);
                updataview(uri);

            }

        }

    }
    public class listshow{
        private List<String> list;
        private Context context;
        public listshow(Context context,List<String> list){
            this.context=context;
            this.list=list;
        }
        public void show(){
            table.removeAllViews();
            for(int i=0;i<list.size();i=i+2){
                try{
                TableRow row=new TableRow(context);
                TextView text=new TextView(context);
                text.setText(list.get(i).toString());
                text.setId(i);
                TextView text1=new TextView(context);
                text1.setText(list.get(i+1).toString());
                text1.setId(i+1);
                row.addView(text);
                row.addView(text1);
                table.addView(row);
                }catch(Exception e){
                    Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        }
    }
}