欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Android 的四个组件内容提供程序,外部应用程序无法访问,原因很简单

最编程 2024-10-17 07:28:35
...

如果你遇到了Content Provider 外部应用不能访问的情况,这篇文章你必须得看完

什么是Content Provider

content provider 可以帮助应用管理对自身存储或由其他应用存储的数据的访问,并提供与其他应用共享数据的方法。它们封装数据,并提供用于定义数据安全性的机制。content provider 是将一个进程中的数据与另一个进程中运行的代码连接的标准接口。实现 content provider 有诸多优势。最重要的是,您可以配置 content provider,让其他应用安全地访问和修改您的应用数据。是Android四大组件之一。

主要功能

数据存取

提供了CRUD(创建、读取、更新、删除)操作,使得应用程序可以通过标准的API来存取数据。

数据隔离

可以为每种数据类型提供一个唯一的URI,从而实现了数据的逻辑隔离。

安全性

可以控制哪些数据可以被哪些应用程序访问,通过权限系统来实现对数据的保护。

使用场景

跨应用程序共享数据,同一个应用程序的不同组件之间共享数据,比如Activity和Fragment之间共享数据。

实现及使用

ContentProvider需要配合着SqlLite使用
创建ContentProviderDemoDbHelp


public class ContentProviderDemoDbHelp extends SQLiteOpenHelper {
   
    //定义数据库名和版本号
    private static final String DBNAME="content_provider_demo.db";
    private static final int VERSION=1;
    public ContentProviderDemoDbHelp(Context context) {
   
        super(context, DBNAME, null, VERSION);
    }
    //创建数据库
    @Override
    public void onCreate(SQLiteDatabase db) {
   
        //创建数据表
        db.execSQL("create table user_table(_id integer primary key autoincrement, userName varchar,pwd varchar, name varchar, sex varchar, age varchar, descs varchar)");
    }
    //升级数据库
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
   

    }
}

创建一个 ContentProviderDemo 继承ContentProvider


public class ContentProviderDemo extends ContentProvider {
   

    //code如果没有匹配 返回的值 存放Uri的容器
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private ContentProviderDemoDbHelp dbHelp;


    //参数一 在AndroidManifest.xml文件中定义的authority
    static {
   
        matcher.addURI("demo.content_provider.contentProviderDemo", "/user_table", 1);
        matcher.addURI("demo.content_provider.contentProviderDemo", "/user_table/#", 2);
    }


    @Override
    public boolean onCreate() {
   
        dbHelp = new ContentProviderDemoDbHelp(getContext());
        return false;
    }
    @SuppressLint("Range")
    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
   
        //根据不同uri查询   匹配Uri 返回对应code
        //得到sqlLiteDataBase
        SQLiteDatabase database = dbHelp.getReadableDatabase();
        Cursor cursor;
        int code = matcher.match(uri);
        cursor = database.query("user_table", strings, s, strings1, s1, null, null, null);
        try {
   
            while (cursor.moveToNext()){
   
               String userName =  cursor.getString(cursor.getColumnIndex(