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

ContentProvider与ContentResolver使用

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

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;
        }

    }