Android应用间数据传递:ContentProvider

ContentProvider是Android中实现应用间数据传递的机制,允许其他应用对你的应用数据进行添删改查操作。相比文件操作模式,ContentProvider提供统一的数据访问方式。创建ContentProvider需要继承ContentProvider类并重写相关方法。本文将逐步介绍如何创建并使用ContentProvider进行数据插入和查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(); //实例化一个ContentValues
values1.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应用间数据传递的全部步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AidenWU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值