安卓组件content的配置方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值