Android应用间数据传递:ContentProvider

来源:互联网 发布:网络工程和网络布线 编辑:程序博客网 时间:2024/05/16 14:27

ContentProvider在android中的作用是用于应用间数据的传递,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。 Android内置的许多数据就是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用XML文件对外共享数据,需要进行xml解析才能读取数据;采用SharedPreferences共享数据,需要使用SharedPreferences API读取数据。

使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

要想使用ContentProvider在应用间传递数据,首先我们要创建一个类,继承ContentProvider,然后重写增删改查等方法,从而对数据进行处理。


第一步:
我们创建一个ProviderWrite工程,在该工程中定义一个类,继承ContentProvider。ContentProvider对数据的处理和数据库相似,所以我们就把要共享的数据存放在数据库中

public class MyProvider extends ContentProvider {    public static final Uri URI = Uri.parse("content://com.ProviderWrite.MyProvider");  //必须添加固定的头文件content://   而后面一连串的数据是MyProvider注册时指定的主机名/域名值    SQLiteDatabase db;    @Override    public boolean onCreate() {        db = getContext().openOrCreateDatabase("provider", Context.MODE_PRIVATE,null); //打开或创建一个数据库        Cursor c = db.rawQuery("select count(*) as c from sqlite_master where type='table' and name='tab'" , null); //判断数据库db中是否已经有表tab        c.moveToFirst();  //将c指向第一条数据        if (c.getInt(0) == 0) { //如果数据库中的这一个数据是null,就会直接返回0            db.execSQL("create table tab(_id integer primary key autoincrement,name text not null)");  //在数据库中创建表tab        }        return true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        Cursor cursor = db.query("tab",null,null,null,null,null,null); //查询表中所有数据        return cursor;    }    @Override    public String getType(Uri uri) {        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        db.insert("tab","_id",values); //在表中插入数据        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        return 0;    }}

第二步:
然后,我们还要在ProviderWrite的AndroidManifest中对MyProvider进行注册声明

 <provider     android:exported="true"  <!- 设置导出为true,否则其他应用无法访问->     android:authorities="com.ProviderWrite.MyProvider"  <!- authorities的值用来指定主机名/域名,用于提供外部访问->     android:name=".Myprovider"/>

通过上面两步操作,我们已经可以简单的增加数据和查找数据了。


第三步:
下面,我们在ProviderWrite的MainActivity中编写插入数据代码:

ContentValues values1 = new ContentValues(); //实例化一个ContentValuesvalues1.put("name","张三");getContentResolver().insert(Myprovider.URI,values1);  //使用系统提供的getContentResolver的inset方法,插入一条数据ContentValues values2 = new ContentValues();values2.put("name","李四");getContentResolver().insert(Myprovider.URI,values2);

第四步:
通过上面的步骤,我们的ProviderWrite应用的provider数据库中已经有数据了,下面我们再创建一个ProviderRead工程,在这个工程中,我们将使用ProviderWrite中的MyProvider的authorities属性值,来创建一个Uri,通过这个来获取数据:

    public static final Uri URI = Uri.parse("content://com.ProviderWrite.MyProvider"); //创建一个Uri    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Cursor cursor = getContentResolver().query(URI,null,null,null,null,null); //通过Uri来查询数据        cursor.moveToFirst();        for (int i = 0;i<cursor.getCount();i++){            Toast.makeText(MainActivity.this, cursor.getString(cursor.getColumnIndex("name")), Toast.LENGTH_LONG).show();            cursor.moveToNext();        }    }

这里写图片描述

通过上面的四步操作,我们就完成了使用ContentProvider来进行Android应用间数据传递的全部步骤。

0 0
原创粉丝点击