Android学习--ContentProvider&ContentResolver

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);//添加规格

    }

你可能感兴趣的:(Android学习--ContentProvider&ContentResolver)