Android四大组件之ContentProvider篇

引言

上篇文章总结了BroadcastReceiver,这篇文章来复习下四大组件的最后一个ContentProvider,ContentProvider能将应用程序内部存储的数据经过其所提供的访问方式分享给其它应用程序使用,让咱们先来看看系统提供的ContentProviderandroid

1、系统提供的ContentProvider

系统提供了各式各样的ContentProvider,好比通信录、短信等等,这里咱们以获取通信录中联系人信息为例bash

data class Contact(val id: Int, val name: String, val phone: String)

private fun getContacts(): List<Contact> {
    val cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null)
    val contacts = ArrayList<Contact>()
    if (cursor != null) {
        while (cursor.moveToNext()) {
            val id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID))
            val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
            // 再根据ID查出电话
            val phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null)
            if (phoneCursor != null) {
                while (phoneCursor.moveToNext()) {
                    val phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(
                            ContactsContract.CommonDataKinds.Phone.NUMBER))
                    contacts.add(Contact(id, name, phoneNumber))
                }
                phoneCursor.close()
            }
        }
        cursor.close()
    }
    return contacts
}
// 所需权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
复制代码

这里先经过contentResolver.query查询出id和name,而后再根据id去另外一张表中查询phoneNumberide

2、自定义ContentProvider

咱们须要建立一个ContentProvider的子类,重写如下几个方法ui

  • onCreate 在应用程序启动时会调用,由于其运行在主线程全部不能执行耗时任务,否则可能会使程序启动过慢,或者直接ANR
  • insert 在子线程运行,外界调用ContentResolver.insert时调用
  • query 在子线程运行,外界调用ContentResolver.query时调用
  • update 在子线程运行,外界调用ContentResolver.update时调用
  • delete 在子线程运行,外界调用ContentResolver.delete时调用
  • getType 若是该Uri表示一条记录返回值应该以vnd.android.cursor.item开头,多条记录返回值应该以vnd.android.cursor.dir/开头

而后再在清单文件中进行配置spa

<provider
    android:authorities="com.hfw.provider"
    android:exported="true"
    android:name=".MyProvider"/>
复制代码

这里的主机名肯定了什么Uri可以调用该ContentProvider,好比这里设置了com.hfw.provider,那么只有以content://com.hfw.provider开头的Uri才会调用该ContentProvider,主机名后面还能够跟上要操做的代表、或者某些条件(本身约定好就行)线程

  • 例如 content://com.hfw.provider/user 表示要操做User表中全部的数据、content://com.hfw.provider/user/zhangsan 表示要操做User表中name为zhangsan的记录
相关文章
相关标签/搜索