Android ContentProvider 组件

内容提供者

内容提供者是什么

  • 内容提供者首先是安卓四大组件之一,用于在不同的应用程序之间实现数据共享,能允许一个程序访问另一个程序中的数据,这里比如A应用的私有文件,或A应用已经有权限访问的外部存储文件,或A应用的数据库数据。都可以通过ContentProvider共享出去。它还可以选择只对某一部分数据进行共享,保护我的的数据隐私

内容提供者的使用

  我们直接来看下面这个例子

  1. 首先我们需要定义一个自定义的ContentProvider类,用于提供数据访问接口
public class MyContentProvider extends ContentProvider {

    @Override
    public boolean onCreate() {
        // 在创建ContentProvider时初始化数据库等资源
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        // 处理查询操作,返回Cursor对象
        MatrixCursor cursor = new MatrixCursor(new String[]{"name", "age"});
        cursor.addRow(new Object[]{"Tom", 20});
        cursor.addRow(new Object[]{"Alice", 25});
        cursor.addRow(new Object[]{"Bob", 30});
        return cursor;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        // 返回数据的MIME类型
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        // 处理插入操作,返回新记录的URI
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        // 处理删除操作,返回受影响的记录数
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        // 处理更新操作,返回受影响的记录数
        return 0;
    }
}
  1. 在AndroidManifest.xml中声明ContentProvider,并指定相应的URI和权限
<provider
    android:name=".MyContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="true">
</provider>
  1. 在应用程序中获取ContentResolver实例,来访问数据
        // 查询数据
        Uri uri = Uri.parse("content://com.example.myapp.provider/data");
        String[] projection = {"name", "age"};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            int nameIndex = cursor.getColumnIndex("name");
            int ageIndex = cursor.getColumnIndex("age");
            if (nameIndex != -1 && ageIndex != -1) {
                while (cursor.moveToNext()) {
                    String name = cursor.getString(nameIndex);
                    int age = cursor.getInt(ageIndex);
                    Log.d("TAG", "name=" + name + ",age=" + age);
                }
            }
            cursor.close();
            
            访问结果:  
            name=Tom,age=20
            name=Alice,age=25
            name=Bob,age=30

为什么定义ContentProvider的URI匹配规则很重要

  • 在使用ContentProvider时,定义URI匹配规则是很重要的,URI匹配规则决定了哪个ContentProvider能够处理特定的URI请求,当有多个ContentProvider存在时,定义的匹配规则可以确保每个请求都会被正确地路由到对应的ContentProvider。这样,不同的ContentProvider可以处理不同的数据集,确定操作类型,保证数据的隔离和安全

ContentProvider能否跨进程通信

  • 可以跨进程通信,其实就跟我上面代码写的一样,定义ContentProvider,在AndroidManifest.xml文件中声明该ContentProvider,主要确保在声明ContentProvider时设置android:exported=“true”,让其他应用程序可以访问它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值