Android学习--ContentProvider&ContentResolver
程序员文章站
2022-03-10 15:51:13
...
ContentProvider
定义
- 可以进行跨app交换数据,类如广播
- 为内容提供者,主要用于两个app之间的数据通信,用于不同进程间的数据共享
- android四大组件之一
- 是一种数据包装器,用于不同进程间的数据共享
创建自定义ContentProvider的步骤
- 使用SQLite创建数据库和数据表
- 新建类继承ContentProvider
- 创建UriMatcher定义Uri规则
- 重写6个方法(onCreate,insert,delete,getType,update,query)
- 在AndroidManifest注册provider
- ContentResolver对ContentProvider共享的数据进行增删改查
ContentResolver
定义
- ContentResolver为数据调用者
- 通过调用ContentProvider,进行增删改查操作
Uri
- 通用资源标识符,代表要操作数据的地址
- 在调用ContentProvider前,必须先确定Uri
UriMatcher
- UriMatcher是用于匹配Uri的Uri规则工具类,匹配Uri后面的路径
- 当调用者传递过来Uri时,我们需要对Uri进行解析,确定调用者需要执行哪个操作
UriMatcher定义Uri规则
- 通过UriMatcher对象的addURI方法定义单挑和批量的Uri规则
- 定义单条和批量的Uri匹配码常量
代码实例
AndroidManifest绑定依赖库
<provider
android:name=".StudentProvider"
android:authorities="com.mymusic.SQLiteStudent2.provider"
android:enabled="true"
android:exported="true">
</provider>
添加一条固定消息
SQLiteTeacher添加消息,显示在SQLiteStudent数据库里
SQLiteStudent继承ContentProvider
在insert中添加代码
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.e(TAG,"insert^^^^^^^^^^^^^^^^^^^^^^^^");
DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
ContentValues v=new ContentValues();
v.put("name","zhangsan");
sqLiteDatabase.insert("student",null,v);
return null;
}
在SQLiteTeacher监听按钮,使用ContentResolver
public void onClick(View v) {
switch (v.getId()){
case R.id.test_btn:
Uri uri=Uri.parse("content://com.mymusic.SQLiteStudent2.provider");
ContentResolver resolver=getContentResolver();
ContentValues values=new ContentValues();
values.put("name",ContentValues);
resolver.insert(uri,values);
break;
输入框添加消息,添加入数据库
SQLiteStudent继承ContentProvider
在insert中添加代码
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
Log.e(TAG,"insert^^^^^^^^^^^^^^^^^^^^^^^^");
DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
sqLiteDatabase.insert("student",null,values);
return null;
}
在SQLiteTeacher监听按钮,使用ContentResolver
public void onClick(View v) {
switch (v.getId()){
case R.id.test_btn:
String name=shuruEt.getText().toString();
Uri uri=Uri.parse("content://com.mymusic.SQLiteStudent2.provider");
ContentResolver resolver=getContentResolver();
ContentValues values=new ContentValues();
values.put("name",name);
resolver.insert(uri,values);
break;
避免进行初始化,放置了静态代码块
SQLiteStudent
private String TAG="StudentProvider";
private DBHelper dbHelper;
public static final int STUDENT=0;
public static final int STUDENT_ITEM=1;
public static final int TEACHER=2;
public static final int TEACHER_ITEM=3;
private static final String AUTHORITY="com.mymusic.SQLiteStudent2.provider";
private static UriMatcher uriMatcher;
//静态代码块
static {
uriMatcher = new UriMatcher(uriMatcher.NO_MATCH);
uriMatcher.addURI("com.mymusic.SQLiteStudent2.provider", "student", STUDENT);
uriMatcher.addURI("com.mymusic.SQLiteStudent2.provider", "student/#", STUDENT_ITEM);
uriMatcher.addURI("com.mymusic.SQLiteStudent2.provider", "teacher", TEACHER);
uriMatcher.addURI("com.mymusic.SQLiteStudent2.provider", "teacher/#", TEACHER_ITEM);//添加规格
}