ContentProvider内容提供者的使用
ContentProvider 的介绍和使用
导入注解的包
implementation ‘androidx.annotation:annotation:+’
ContentProvider介绍
其实呢,内容提供者很好理解,就是给其他的应用程序,提供一个访问我们sqlite的文件的机会.
因为涉及到数据的安全,才有了提供者和解析者.
只有提供者提供了数据,解析者才可以拿到.
1.ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。
2.技能get点:
(1)访问系统自带的内容提供者(******)
手机联系人/音频/视频/图库/短信/系统设置
(2)自己写内容提供者
3.三个重点
(1) contentProvider 内容提供者
(2) contentResolve 内容解析者
(3) uri 地址
可以简单的理解为:
内容提供者提供一个地址,内容解析者把uri解析一下,去指向提供者的地址.
原理图
ContentProvider机制
内容提供者的运行原理
进程内数据共享
不同进程间的数据通信
自定义ContentProvider
一,什么是自定义内容提供者
谈到内容提供者,大家就应该想到提供方和索要方,现在,我们想要做提供方,别人来访问我们的数据库,那我们就需要自定义内容提供者了。
二.思路:
1.提供方:ContentProvider
(1)创建数据库,自定义类继承SQLiteOpenHelper
(2)自定义内容提供者类,继承ContentProvider,重写insert/delete/update/query方法,向外界提供方法
(3)清单文件中注册内容提供者
2.索要方:ContentResolver
(1)通过Context的getContentResolver方法获得ContentResolver对象
(2)确定uri
(3)调用insert/delete/update/query方法访问数据库
三.提供者代码:创建my_contentprovider (新建的moudle)
(1)自定义类继承SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "user.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user (_id integer primary key autoincrement ,name varchar(30),age integer)");
for(int i=1;i<10;i++){
db.execSQL("insert into user values(null,?,?)",new String[]{
"非常的帅"+i+"",i+""});
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
(2)自定义内容提供者类,继承ContentProvider
重新其他的方法
package com.example.my_contentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.CancellationSignal;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class MyProvider extends ContentProvider