ContentProvider能够实现不同应用程序之间的数据共享
1.需要用到的帮助类
1)Uri
URI(统一资源标识符)代表要操作的数据,可以用来标识每个ContentProvider,这样你就可以通过指定的URI找到想要的ContentProvider,从中获取或修改数据。由URI来决定操作对哪个数据源进行!!
- A:schema,已经由Android所规定为:content://
- B:主机名(Authority),是URI的授权部分,是唯一标识符,用来定位ContentProvider。
- C:指向一个对象集合,一般用表的名字,如果没有指定D部分,则返回全部记录。
- D:指向特定的记录,这里表示操作user表id为7的记录。如果要操作user表中id为7的记录的name字段, D部分变为 /7/name即可。
2.)UriMatcher类使用介绍
UriMatcher类用于匹配Uri
a)addURI
// content://主机名/对象集合名/id
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "insert", INSERTSUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "delete", DELETESUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "updata", UPDATASUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "query", QUERYSUCCESS);
//添加需要匹配的URI,如果匹配成功则返回第三个参数,例如INSERTSUCCESS
b)match
//用于匹配uri,返回uri的匹配值
QUERYSUCCESS == uriMatcher.match(uri)
2. ContentProvider
1)数据源端
a)定义路径匹配器,并添加URI
//定义路径匹配器!(匹配不成功时,返回一个NO_MATCH,值为-1)
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int INSERTSUCCESS = 0;//对该数据库 插入匹配成功时的返回值
private static final int DELETESUCCESS = 1;//对该数据库 删除匹配成功时的返回值
private static final int UPDATASUCCESS = 2;//对该数据库 修改匹配成功时的返回值
private static final int QUERYSUCCESS = 3;//对该数据库 查询匹配成功时的返回值
//创建一个静态代码块,用于添加URI
static {//该代码块在加载类时只执行一次!!!
// content://主机名/对象集合名/id
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "insert", INSERTSUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "delete", DELETESUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "updata", UPDATASUCCESS);
uriMatcher.addURI("com.example.practice7sqliteandprovider.StaffProvider", "query", QUERYSUCCESS);
}
b)重写增删改查函数
public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
if (QUERYSUCCESS == uriMatcher.match(uri)) {//这些操作对谁执行是由URI决定的!!!!
//打开数据库
MyDBOpenHelper myDBOpenHelper = new MyDBOpenHelper(getContext(), "Staff.db", null, 1);
SQLiteDatabase db = myDBOpenHelper.getReadableDatabase();
Cursor cursor = db.query("Staffinfo", strings, s, strings1, null, null, s1, null);
//db.close(); 这里注意!!关闭数据库会报错!!!运行异常
return cursor;
}
return null;
}
逻辑思想:通过调用端传来的URI来确定这些“操作”是对哪个数据源进行的!!
c)在manifest清单文件中声明
<provider
android:authorities="com.example.practice7sqliteandprovider.StaffProvider"
android:name=".StaffProvider"
android:exported="true">
</provider>
注意主机名的定义,通过用"包名+类名"
exported要设为true,允许其他应用程序访问
2)调用端
通过Resolver对象来对数据源进行增删改查操作
//添加点击事件
query.setOnClickListener(new View.OnClickListener() {
@SuppressLint("Range")
@Override
public void onClick(View view) {
//通过uri找到目标数据源的Provider!!
Uri uri = Uri.parse("content://com.example.practice7sqliteandprovider.StaffProvider/query");
//调用Resolver的查询接口进行查询,通过uri来将查询操作定位到某个数据源
Cursor cursor = getContentResolver().query(uri, new String[]{"_id","name","sex","department","salary"}, null, null, null);
//遍历输出数据
String message = "数据库:\n";
while (cursor.moveToNext()){
message += "ID:"+cursor.getInt(cursor.getColumnIndex("_id"))+"; ";
message += "姓名:"+cursor.getInt(cursor.getColumnIndex("name"))+"; ";
message += "性别:"+cursor.getInt(cursor.getColumnIndex("sex"))+"; ";
message += "部门:"+cursor.getInt(cursor.getColumnIndex("department"))+"; ";
message += "工资:"+cursor.getInt(cursor.getColumnIndex("salary"))+";\n";
}
show.setText(message);
Toast.makeText(MainActivity.this, "查询成功!!", Toast.LENGTH_SHORT).show();
}
});