一、什么是ContentProvider
ContentProvider是Android四大组件之一
ContentProvider是一种数据包装器(发布者),它提供统一的接口对数据进行操作,调用者不用关心数据到底是如何存储的
ContentProvider主要用于不同应用程序间,不同进程间的数据共享
二、什么是ContentResolver
1、 ContentResolver是数据调用者,ContentProvider将数据发布出来后,通过 ContentResolver对象结合Uri进行调用
2、 通过 ContentResolver可以调用ContentProvider的增、删、改、查操作
三、什么是Uri
1、 通用资源标识符
2、Uri代表要操作数据的地址,每个ContentProvider发布数据时都有一个唯一的地址
3、uri:content(固定写法)://com.android.contacts(包名)/contacts(要访问资源的路径)
四、创建自定义ContentProvider的步骤
- 使用SQLite技术,创建好数据库和数据表;
- 新建类继承ContentProvider;
- 创建UriMatcher,定义Uri规则;
- 重写6个抽象方法(onCreate、insert、delete 、getType、 update、 query);
- 在AndroidManifest中注册Provider;
- ContentResolver 对ContentProvider共享的数据进行增删改查。
五、使用ContentProvider实例
- 在项目中创建好数据库和数据表
- 新建一个类继承ContentProvider,重写6个抽象方法
- 在AndroidManifest中注册Provider
public class MyProvider extends ContentProvider {
private String TAG = "MyProvider";
@Override
public boolean onCreate() {
Log.e(TAG, "onCreate..............");
return false;
}
//重写query方法,实现查询操作
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
Log.e(TAG, "query..............");
DBHepler dbHepler = new DBHepler(getContext(), "student_db", null, 1);
SQLiteDatabase database = dbHepler.getWritableDatabase();
Cursor cursor = null;
cursor = database.query("student", strings, s, strings1, null, null, s1);
return cursor;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.e(TAG, "getType..............");
return null;
}
//重写insert方法,实现添加操作
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
Log.e(TAG, "insert..............");
DBHepler dbHepler = new DBHepler(getContext(), "student_db", null, 1);
SQLiteDatabase database = dbHepler.getWritableDatabase();
database.insert("student", null, contentValues);
return null;
}
//重写delete方法,实现删除操作
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "delete..............");
DBHepler dbHepler = new DBHepler(getContext(), "student_db", null, 1);
SQLiteDatabase database = dbHepler.getWritableDatabase();
database.delete("student", s, strings);
return 0;
}
//重写update方法,实现更新操作
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "update..............");
DBHepler dbHepler = new DBHepler(getContext(), "student_db", null, 1);
SQLiteDatabase database = dbHepler.getWritableDatabase();
int updateRows = 0;
updateRows = database.update("student", contentValues, s, strings);
return updateRows;
}
}
<provider
android:enabled="true"
android:exported="true"
android:name=".MyProvider"
android:authorities="com.example.studentdemo.provider" />
1.创建一个新项目,新建Activity和布局文件
2. 在布局中创建所需要的控件,并在Activity中进行定义,绑定ID,设置监听
3. 作为接受方通过resolver传递参数来实现增、删、改、查的方法
<Button
android:id="@+id/main_test_btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="测试一下"
android:textSize="20sp"/>
<EditText
android:id="@+id/main_name_et"
android:layout_width="match_parent"
android:layout_height="50dp" />
<Button
android:id="@+id/main_add_btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="添加数据"
android:textSize="20sp"/>
<EditText
android:id="@+id/main_delete_et"
android:layout_width="match_parent"
android:layout_height="50dp" />
<Button
android:id="@+id/main_delete_btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="删除数据"
android:textSize="20sp"/>
<Button
android:id="@+id/main_search_btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="查询"
android:textSize="20sp"/>
<EditText
android:id="@+id/main_before_et"
android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="旧的"/>
<EditText
android:id="@+id/main_after_et"
android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="新的"/>
<Button
android:id="@+id/main_modify_btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="修改数据"
android:textSize="20sp"/>
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button testBtn;
private Button addBtn;
private Button deleteBtn;
private Button searchBtn;
private Button modifyBtn;
private EditText nameEt;
private EditText deleteEt;
private EditText beforeEt;
private EditText afterEt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindID();
}
private void bindID() {
testBtn=findViewById(R.id.main_test_btn);
addBtn=findViewById(R.id.main_add_btn);
deleteBtn=findViewById(R.id.main_delete_btn);
searchBtn=findViewById(R.id.main_search_btn);
modifyBtn=findViewById(R.id.main_modify_btn);
nameEt=findViewById(R.id.main_name_et);
deleteEt=findViewById(R.id.main_delete_et);
beforeEt=findViewById(R.id.main_before_et);
afterEt=findViewById(R.id.main_after_et);
testBtn.setOnClickListener(this);
addBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
searchBtn.setOnClickListener(this);
modifyBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.main_test_btn://测试
Uri uri=Uri.parse("content://com.example.studentdemo.provider");
ContentResolver resolver=getContentResolver();
resolver.delete(uri,null,null);
break;
case R.id.main_add_btn://添加数据
String name=nameEt.getText().toString();
Uri uri1=Uri.parse("content://com.example.studentdemo.provider");
ContentResolver resolver1=getContentResolver();
ContentValues values=new ContentValues();
values.put("name",name);
resolver1.insert(uri1,values);
break;
case R.id.main_delete_btn://删除数据
Uri uri2=Uri.parse("content://com.example.studentdemo.provider");
ContentResolver resolver2=getContentResolver();
resolver2.delete(uri2,"name=?",new String[]{deleteEt.getText().toString()});
break;
case R.id.main_search_btn://查询数据
Uri uri3=Uri.parse("content://com.example.studentdemo.provider/student");
Cursor cursor=getContentResolver().query(uri3,null,null,null,null);
if (cursor!=null){
while (cursor.moveToNext()){
String sname=cursor.getString(cursor.getColumnIndex("name"));
Log.e( "onClick: ",sname );
}
cursor.close();
}
break;
case R.id.main_modify_btn://修改数据
String aftername=afterEt.getText().toString();
Uri uri4=Uri.parse("content://com.example.studentdemo.provider");
ContentResolver resolver4=getContentResolver();
ContentValues values4=new ContentValues();
values4.put("name",aftername);
resolver4.update(uri4,values4,"name=?",new String[]{beforeEt.getText().toString()});
break;
default:
break;
}
}
}