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的記錄
相關文章
相關標籤/搜索