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