关于ContentProvider&ContentResolver的学习与使用

一、ContentProvider的定义

1.ContentProvider是Android的四大组件
2.ContentProvider是一种数据包装器(发布者),它提供统一的接口对数据进行操作,调用者不用关心数据到底是如何存储的
3.ContentProvider主要用于不同APP间,不同进程间的数据分享

二、ContentProvider的使用步骤

  • 使用SQLite技术,创建好数据库和数据表
  • 新建类继承ContentProvider
  • 创建UriMatcher定义Uri规则
  • 重写6个抽象方法(onCreate,insert,delete,getType,update,query)
  • 在AndroidManifest中注册Provider
  • ContentProvider,对ContentProvider共享的数据进行增删改查

三、ContentResolver的定义

1.ContentResolver是数据调用者,ContentProvider将数据发布出来后,通过ContentResolver对象结合Uri进行调用
2.通过ContentResolver可以调用ContentProvider的增,删,改,查操作


注意点:****ContentProvider和ContentResolver无疑是很重要的,而在它们之间进行数据传递的,也是很重要的,就是Uri


四、Uri的定义

1.通用资源的标识符,简称Uri
2.Uri代表要操作数据的地址,每个ContentProvider发布数据时都有一个唯一的地址
3.Uri的标准写法:content://com.android.contacts/contacts


注意点:*在调用ContentProvider前,必须要先确定Uri***


五、UriMatcher类的定义

1.UriMatcher是用于匹配Uri的Uri规则工具类
2.当调用者传递过来的Uri时,需要对Uri进行解析,确定调用者需要执行哪个操作

六、ContentProvider&ContentResolver结合使用的示例(以增为例)

因为ContentProvider是跨APP调用的,所以我们要创建两个Activity,我在这里简称为ActivityA和ActivityB
1.首先在ActivityA里新建一个类继承ContentProvider,在里面实现他的几个构造方法

public class MyContentProivder extends ContentProvider {
    private String  TAG="MyContentProivder";


    @Override
    public boolean onCreate() {
        Log.e(TAG, "onCreate************************ " );
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        Log.e(TAG, "query************************ " );
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        Log.e(TAG, "getType************************ " );
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
        Log.e(TAG, "insert************************ " );

        return null;

    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        Log.e(TAG, "delete************************ " );

        return 1;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        Log.e(TAG, "update************************ " );
        return 0;
    }
}

2.然后在该Activity的AndroidManifest里注册Provider

 <provider
            android:enabled="true"
            android:exported="true"
            android:authorities="com.example.studentdemo.db"
            android:name=".entity.MyContentProivder"/>

3.然后到ActivityB里的layout布局里定义一些需要的控件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.contentresover.MainActivity">

    <EditText
        android:id="@+id/input_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/text_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试"/>

LinearLayout>

4.然后回到主体类里定义这些控件,设置点击事件,写出switch判断语句

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button textBtn;
    private EditText inputET;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textBtn=findViewById(R.id.text_btn);
        inputET=findViewById(R.id.input_et);

        textBtn.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.text_btn:

5.然后到ActivityA里的insert方法里写以下增的方法

  DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
        SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put("name","zhangsan");
        sqLiteDatabase.insert("student",null,values);
        return null;

6.最后回到ActivityB里的点击方法里写出增的具体代码

 String name=inputET.getText().toString();
                Uri uri=Uri.parse("content://com.example.studentdemo.db/student");
                ContentResolver resolver=getContentResolver();
                ContentValues values=new ContentValues();
                values.put("name",name);
                resolver.insert(uri,values);

                break;

这里要注意Uri写的网址要和注册时的网址一样
笔芯!

你可能感兴趣的:(关于ContentProvider&ContentResolver的学习与使用)