ContentProvider&ContentResolver

什么是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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值