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

ContentProvider&ContentResolver

程序员文章站 2024-02-09 16:49:52
...

什么是ContentProvider

1.ContentProvider是android四大组件之一;
2.ContentProvider是一种数据包装器/发布者,它提供统一的接口对数据进行操作,调用者不用关心数据到底是如何存储的;
3.ContentProvider主要用于不同应用程序间和不同进程间的数据共享。

什么是ContentResolver

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

什么是Uri

1.通用资源标识符
2.Uri代表要操作数据的地址。每个ContentProvider发布数据时都有一个唯一的地址。

创建自定义ContentProvider的步骤

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

代码实例

在之前创建的项目StudentTest基础上进行操作,这个项目里已经创建好数据库student_db和数据表student,StudentTest里只包含一个表格student,所以不需要使用UriMatcher,若项目里不止一张表,那么就需要用到UriMatcher来进行判定了,下面会分别就这两种情况进行讲解。
首先是只有一张student表:
需要创建子类StudentContentProvider继承ContentProvider,一般情况下有两种创建方法:
1.new——>Java class,继承ContentProvider方法,重写6个抽象方法,还需要在AndroidManifest中注册provider;
2.new——>others——>Content Provider,这是创建Content Provider的快捷方法,系统会自动生成继承ContentProvider方法和在AndroidManifest中注册provider。

public class StudentContentProvider extends ContentProvider {

    public StudentContentProvider() {
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        return 0;
    }
}

发布者ContentProvider已就绪,需要数据调用者ContentResolver,所以新建project(TeacherTest).
在activity_main中定义输入框和按钮,举例天际数据和删除数据,直接上代码

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/insert_name_edit"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <Button
        android:id="@+id/teacher_insert_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="添加"/>

    <EditText
        android:id="@+id/delect_name_edit"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <Button
        android:id="@+id/teacher_delect_btn"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="删除"/>

</LinearLayout>

先上MainActivity全部代码

package comt.lenovo.teachertest;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button insertBtn,delectBtn;
    private EditText nameEdit,delectEdit;

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

        bindID();

    }

    private void bindID() {
        insertBtn = findViewById(R.id.teacher_insert_btn);
        nameEdit = findViewById(R.id.insert_name_edit);
        delectBtn = findViewById(R.id.teacher_delect_btn);
        delectEdit = findViewById(R.id.delect_name_edit);
        insertBtn.setOnClickListener(this);
        delectBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.teacher_insert_btn://添加数据
                String name = nameEdit.getText().toString();
                Uri uri = Uri.parse("content://comt.lenovo.studenttest");
                ContentResolver resolver = getContentResolver();
                ContentValues values = new ContentValues();
                values.put("name",name);
                resolver.insert(uri,values);
                break;
            case R.id.teacher_delect_btn://删除数据
                String delectName = delectEdit.getText().toString();
                Uri uri2 = Uri.parse("content://comt.lenovo.studenttest");
                ContentResolver resolver2 = getContentResolver();
                ContentValues values2 = new ContentValues();
                values2.put("name",delectName);
                resolver2.delete(uri2,"name=?",new String[]{delectName});
                break;
        }
    }
}

主要代码只有一部分

@Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.teacher_insert_btn://添加数据
                String name = nameEdit.getText().toString();
                Uri uri = Uri.parse("content://comt.lenovo.studenttest");
                ContentResolver resolver = getContentResolver();
                ContentValues values = new ContentValues();
                values.put("name",name);
                resolver.insert(uri,values);
                break;
            case R.id.teacher_delect_btn://删除数据
                String delectName = delectEdit.getText().toString();
                Uri uri2 = Uri.parse("content://comt.lenovo.studenttest");
                ContentResolver resolver2 = getContentResolver();
                ContentValues values2 = new ContentValues();
                values2.put("name",delectName);
                resolver2.delete(uri2,"name=?",new String[]{delectName});
                break;
        }
    }

在发布者ContentProvider中StudentContentProvider.java文件中需要作出相应设置,代码如下:

@Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.e(TAG,"insert"+"###########################");
        DBHelper2 dbHelper2 = new DBHelper2(getContext(),"student_db",null,1);
        SQLiteDatabase database = dbHelper2.getWritableDatabase();
        database.insert("student",null,values);
        return null;
    }
@Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.e(TAG,"delect"+"###########################");
        DBHelper2 dbHelper2 = new DBHelper2(getContext(),"student_db",null,1);
        SQLiteDatabase database = dbHelper2.getWritableDatabase();
        database.delete("student",selection,selectionArgs);
        return 0;
    }