关于ContentProvider&ContentResolver的学习与使用
一、ContentProvider的定义
1.ContentProvider是Android的四大组件
2.ContentProvider是一种数据包装器(发布者),它提供统一的接口对数据进行操作,调用者不用关心数据到底是如何存储的
3.ContentProvider主要用于不同APP间,不同进程间的数据分享
二、ContentProvider的使用步骤
- 使用SQLite技术,创建好数据库和数据表
- 新建类继承ContentProvider
- 创建UriMatcher定义Uri规则
- 重写6个抽象方法(onCreate,insert,delete,getType,update,query)
- 在AndroidManifest中注册Provider
- ContentProvider,对ContentProvider共享的数据进行增删改查
三、ContentResolver的定义
1.ContentResolver是数据调用者,ContentProvider将数据发布出来后,通过ContentResolver对象结合Uri进行调用
2.通过ContentResolver可以调用ContentProvider的增,删,改,查操作
注意点:****ContentProvider和ContentResolver无疑是很重要的,而在它们之间进行数据传递的,也是很重要的,就是Uri
四、Uri的定义
1.通用资源的标识符,简称Uri
2.Uri代表要操作数据的地址,每个ContentProvider发布数据时都有一个唯一的地址
3.Uri的标准写法:content://com.android.contacts/contacts
注意点:*在调用ContentProvider前,必须要先确定Uri***
五、UriMatcher类的定义
1.UriMatcher是用于匹配Uri的Uri规则工具类
2.当调用者传递过来的Uri时,需要对Uri进行解析,确定调用者需要执行哪个操作
六、ContentProvider&ContentResolver结合使用的示例(以增为例)
因为ContentProvider是跨APP调用的,所以我们要创建两个Activity,我在这里简称为ActivityA和ActivityB
1.首先在ActivityA里新建一个类继承ContentProvider,在里面实现他的几个构造方法
public class MyContentProivder extends ContentProvider {
private String TAG="MyContentProivder";
@Override
public boolean onCreate() {
Log.e(TAG, "onCreate************************ " );
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
Log.e(TAG, "query************************ " );
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
Log.e(TAG, "getType************************ " );
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
Log.e(TAG, "insert************************ " );
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "delete************************ " );
return 1;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
Log.e(TAG, "update************************ " );
return 0;
}
}
2.然后在该Activity的AndroidManifest里注册Provider
<provider
android:enabled="true"
android:exported="true"
android:authorities="com.example.studentdemo.db"
android:name=".entity.MyContentProivder"/>
3.然后到ActivityB里的layout布局里定义一些需要的控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.contentresover.MainActivity">
<EditText
android:id="@+id/input_et"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/text_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试"/>
</LinearLayout>
4.然后回到主体类里定义这些控件,设置点击事件,写出switch判断语句
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button textBtn;
private EditText inputET;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBtn=findViewById(R.id.text_btn);
inputET=findViewById(R.id.input_et);
textBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.text_btn:
5.然后到ActivityA里的insert方法里写以下增的方法
DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","zhangsan");
sqLiteDatabase.insert("student",null,values);
return null;
6.最后回到ActivityB里的点击方法里写出增的具体代码
String name=inputET.getText().toString();
Uri uri=Uri.parse("content://com.example.studentdemo.db/student");
ContentResolver resolver=getContentResolver();
ContentValues values=new ContentValues();
values.put("name",name);
resolver.insert(uri,values);
break;
这里要注意Uri写的网址要和注册时的网址一样
笔芯!
下一篇: 检查端口/物理网口是否有连接