欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android学习--ContentProvider&ContentResolver

程序员文章站 2022-03-10 15:51:13
...

ContentProvider

定义

  • 可以进行跨app交换数据,类如广播
  • 为内容提供者,主要用于两个app之间的数据通信,用于不同进程间的数据共享
  • android四大组件之一
  • 是一种数据包装器,用于不同进程间的数据共享

创建自定义ContentProvider的步骤

  1. 使用SQLite创建数据库和数据表
  2. 新建类继承ContentProvider
  3. 创建UriMatcher定义Uri规则
  4. 重写6个方法(onCreate,insert,delete,getType,update,query)
  5. 在AndroidManifest注册provider
  6. ContentResolver对ContentProvider共享的数据进行增删改查

ContentResolver

定义

  • ContentResolver为数据调用者
  • 通过调用ContentProvider,进行增删改查操作

Uri

  • 通用资源标识符,代表要操作数据的地址
  • 在调用ContentProvider前,必须先确定Uri

UriMatcher

  • UriMatcher是用于匹配Uri的Uri规则工具类,匹配Uri后面的路径
  • 当调用者传递过来Uri时,我们需要对Uri进行解析,确定调用者需要执行哪个操作

UriMatcher定义Uri规则

  1. 通过UriMatcher对象的addURI方法定义单挑和批量的Uri规则
  2. 定义单条和批量的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);//添加规格

    }