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

关于ContentProvider&ContentResolver的学习与使用

程序员文章站 2022-03-10 16:10:46
...

一、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