ContentProvider与ContentResolver使用

1.什么是ContentProvider

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

2.什么是Uri?

上面使用ContentResolver需要结合Uri进行调用,那么什么是Uri:
通用资源标识符简称URI;
Uri代表操作数据的地址,每个ContentProvider发布数据都有一个唯一的地址;
Uri格式:content://com.android.app/contacts

3.创建自定义ContentProvide的步骤

1.使用SQLine,创建数据库和数据表;
2.新建类继承ContentProvider;
3.创建UriMatcher定义Uri的规则;
4.重写ContentProvider的6个方法;
5.在Manifest中注册Provider;
6.ContentResolver对ContentProvider共享数据进行操作;

4.自定义ContentProvider简易例子:

首先在一个项目中完成好数据库表的创建;
新建一个类继承ContentProvider;
并重写ContentProvider的6个方法;
在方法中实现数据库 增、删、改、查的操作;
public class Myprovider extends ContentProvider {

    @Override
    //重写onCreate方法
    public boolean onCreate() {
       dbHelpter = new DBHelpter(getContext(), "demodb", null, 1);
        Log.e("0000000000","onCreate");
        return false;
    }

    @Nullable
    @Override
        //重写query方法、实现查询操作。
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
      SQLiteDatabase db=dbHelpter.getWritableDatabase();
      Cursor cursor=null;
      cursor=db.query("student",projection,selection,selectionArgs,null,null,sortOrder);

    }
        Log.e("0000000000000000000","query");
        return cursor;
    }

    @Nullable
    @Override
        //重写getType方法
    public String getType(@NonNull Uri uri) {
        Log.e("0000000000000000000","getType");
        return null;
    }

    @Nullable
    @Override
        //重写insert方法 实现增加操作。
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        SQLiteDatabase db=dbHelpter.getWritableDatabase();
        db.insert("student", null, values);

        Log.e("0000000000000000000","insert");
        return null;
    }

    @Override
        //重写delete方法 实现删除操作
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        SQLiteDatabase db=dbHelpter.getWritableDatabase();
        db.delete("student",selection,selectionArgs);
        Log.e("0000000000000000000","delete");
        return 0;
    }

    @Override
        //重写update方法 实现更新操作
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        SQLiteDatabase db=dbHelpter.getWritableDatabase();
        int num=0;
        num= db.update("student",values,selection,selectionArgs);
        Log.e("0000000000000000000","update");
        return num;
    }
}
在Manifest中注册Provider;
其中 "com.example.myapplication.provider“做为Uri的存放地址。
<provider
            android:exported="true"
            android:enabled="true"
            android:authorities="com.example.myapplication.provider"
            android:name=".entity.Myprovider">
        </provider>
在另外一个Project中创建新的Activity作为接受方通过resolver传递参数来实现增、删、改、查的方法。
public class ProviderActivity extends AppCompatActivity implements View.OnClickListener {
    private Button button;
    private Button button2;
    private Button button3;
    private Button button4;
    private EditText editText;
    private EditText editText2;
    private Uri uri;
    private  ContentResolver resolver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_provider);
        button = findViewById(R.id.btn_provider);
        button2 = findViewById(R.id.btn_provider2);
        button3 = findViewById(R.id.btn_provider3);
        button4 = findViewById(R.id.btn_provider4);
        editText=findViewById(R.id.edittext);
        editText2=findViewById(R.id.edittext2);
        uri = Uri.parse("content://com.example.myapplication.provider");
        resolver = getContentResolver();
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);
        button4.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

            case R.id.btn_provider2:
            //增
                ContentValues values = new ContentValues();
                values.put("Name", ""+editText.getText().toString());
                resolver.insert(uri, values);
                break;
            case R.id.btn_provider:
           // 删
                resolver.delete(uri, "Name=?", new String[]{editText2.getText().toString()});
                break;
            case R.id.btn_provider3:
            //查
                Cursor cursor=getContentResolver().query(uri,null,null,null,null);
                while (cursor.moveToNext()){
                    String s=cursor.getString(cursor.getColumnIndex("Name"));
                    Log.e("000000000000",""+s);
                }
                cursor.close();
                break;

            case R.id.btn_provider4:
            //改
                ContentValues contentValues = new ContentValues();
                contentValues.put("Name", editText.getText().toString());
                resolver.update(uri,contentValues,"Name=?", new String[]{editText2.getText().toString()});
                break;
        }

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值