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(
上一篇: 标准球 标准锥