public class TestContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
// TODO 做一些初始化操作
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO 查询
return null;
}
@Override
public String getType(Uri uri) {
// TODO MIME Type
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO 插入
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO 删除
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO 更新
return 0;
}
}
然后,需要在 AndroidManifest.xml 中注册。
public class ContentProviderActivity extends BaseActivity {
private Uri uriUser =
Uri.parse("content://com.jeanboy.testprovider/user");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content_provider);
}
public void toInsert(View view) {
ContentValues values = new ContentValues();
values.put("id", 3);
values.put("name", "张三");
ContentResolver resolver = getContentResolver();
resolver.insert(uriUser, values);
}
public void toUpdate(View view) {
ContentValues values = new ContentValues();
values.put("id", 3);
values.put("name", "张三三");
ContentResolver resolver = getContentResolver();
resolver.update(uriUser, values, "id = ?", new String[]{"3"});
}
public void toSelect(View view) {
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uriUser, new String[]{"id", "name"},
null, null, null);
while (cursor.moveToNext()) {
Log.e(TAG, "=========== query :" + cursor.getInt(0) + "=="
+ cursor.getString(1));
}
cursor.close();
}
public void toDelete(View view) {
ContentResolver resolver = getContentResolver();
resolver.delete(uriUser, "id = ?", new String[]{"3"});
}
}
在 AndroidManifest.xml 中 provider 标签中有三个额外的参数 permission、readPermission、writePermission。
exported
这个属性用于指示该服务是否能被其他程序应用组件调用或跟他交互; 取值为(true | false)。
如果设置成true,则能够被调用或交互,否则不能;设置为 false 时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
readPermission
使用 Content Provider 的查询功能所必需的权限,即使用 ContentProvider 里的 query() 函数的权限。
writePermission
使用 ContentProvider 的修改功能所必须的权限,即使用 ContentProvider 的 insert()、update()、delete() 函数的权限。
permission
客户端读、写 Content Provider 中的数据所必需的权限名称。
private fun operateData() {
val userUri = Uri.parse("content://com.yang.provider.myprovider/user")
val jobUri = Uri.parse("content://com.yang.provider.myprovider/job")
// 向 user 表插入一条数据
contentResolver.insert(userUri, ContentValues().apply {
put("_id", 3)
put("name", "chen")
})
// 查询 user 表数据
val cursor = contentResolver.query(userUri, arrayOf("_id", "name"), null, null, null)
while (cursor!!.moveToNext()) {
println("query user:" + cursor.getInt(0) + " " + cursor.getString(1))
}
// 主动关闭游标
cursor.close()
// 向 job 表插入一条数据
contentResolver.insert(jobUri, ContentValues().apply {
put("_id", 3)
put("job", "Web")
})
// 查询 job 表数据
val cursor2 = contentResolver.query(jobUri, arrayOf("_id", "job"), null, null, null)
while (cursor2!!.moveToNext()) {
println("query job:" + cursor2.getInt(0) + " " + cursor2.getString(1))
}
cursor2.close()
}
// 执行 operateData() 方法,输出结果如下:
I/System.out: query user:1 yang
I/System.out: query user:2 zhang
I/System.out: query user:3 chen
I/System.out: query job:1 Android
I/System.out: query job:2 iOS
I/System.out: query job:3 Web
创建数据库类,数据库中存在两个表,分别是 user 和 job 表。
class DBHelper(
context: Context
) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
override fun onCreate(db: SQLiteDatabase) {
// 创建两个表格:用户表 和 职业表
db.execSQL("CREATE TABLE IF NOT EXISTS $USER_TABLE_NAME(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)")
db.execSQL("CREATE TABLE IF NOT EXISTS $JOB_TABLE_NAME(_id INTEGER PRIMARY KEY AUTOINCREMENT, job TEXT)")
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {}
companion object {
// 数据库名
private const val DATABASE_NAME = "finch.db"
// 表名
const val USER_TABLE_NAME = "user"
const val JOB_TABLE_NAME = "job"
//数据库版本号
private const val DATABASE_VERSION = 1
}
}
使用 ContentResolver 操作 进程 1 的 ContentProvider
private fun operateData() {
val userUri = Uri.parse("content://com.yang.provider.myprovider/user")
val jobUri = Uri.parse("content://com.yang.provider.myprovider/job")
// 对 user 表进行操作
contentResolver.insert(userUri, ContentValues().apply {
put("_id", 4)
put("name", "huang")
})
val cursor = contentResolver.query(userUri, arrayOf("_id", "name"), null, null, null)
while (cursor!!.moveToNext()) {
println("ipc query user:" + cursor.getInt(0) + " " + cursor.getString(1))
}
cursor.close()
// 对 job 表进行操作
contentResolver.insert(jobUri, ContentValues().apply {
put("_id", 4)
put("job", "algorithm")
})
val cursor2 = contentResolver.query(jobUri, arrayOf("_id", "job"), null, null, null)
while (cursor2!!.moveToNext()) {
println("ipc query job:" + cursor2.getInt(0) + " " + cursor2.getString(1))
}
cursor2.close()
}
// 执行 operateData() 方法,输出结果如下:
I/System.out: ipc query user:1 yang
I/System.out: ipc query user:2 zhang
I/System.out: ipc query user:4 huang
I/System.out: ipc query job:1 Android
I/System.out: ipc query job:2 iOS
I/System.out: ipc query job:4 algorithm