Content Provider: ano ito, arkitektura ng komponent at prinsipyo ng paggana

May-akda: IT Sectr Nai-publish: 2026-06-17 Oras ng pagbabasa: 8 min

Content Provider — ay isang komponent ng Android na nagbibigay ng pinag-isang interface para sa pag-access ng data sa pagitan ng mga application. Inaabstrakto nito ang pisikal na imbakan (SQLite, mga file, mga mapagkukunan ng network) at tinitiyak ang ligtas na pagpapalitan ng impormasyon sa pamamagitan ng ContentResolver. Ayon sa Android Developer Guide, 2026, ang Content Provider ay isa sa apat na pangunahing komponent ng Android application kasama ang Activity, Service at BroadcastReceiver. Ang gawain nito ay gawing available ang data sa iba pang mga application na may kontrol ng mga pahintulot sa pagbasa at pagsulat.

Mga Pangunahing Punto

  • Content Provider — ang pamantayang komponent ng Android para sa pagpapalitan ng data sa pagitan ng mga application sa pamamagitan ng interface ng ContentResolver.
  • URI (content://) ay tumutukoy sa table o record at ginagamit para sa lahat ng CRUD operations gamit ang provider.
  • UriMatcher — isang klase ng serbisyo na nag-parse ng mga papasok na URI at tinutukoy kung aling table o row ang hiniling.
  • Mga pahintulot sa pagbasa at pagsulat ay itinakda sa manifest at hinihiling sa user sa pag-install.
  • CursorLoader o Room na may Content Provider ay nagbibigay ng asynchronous na pag-load ng data mula sa provider nang hindi hinaharangan ang UI thread.

Ano ang Content Provider?

Content Provider — ay isang komponent ng Android na namamahala ng access sa sentralisadong imbakan ng data at nagbibigay nito sa iba pang mga application sa pamamagitan ng pinag-isang interface ng kontrata. Itinatago nito ang mga detalye ng implementasyon ng imbakan: ang data ay maaaring itago sa SQLite, sa file system, sa cloud, o maging resulta ng isang network request.

Ang Android ay may kasamang mga built-in na Content Provider para sa system data — ContactsContract, MediaStore, CalendarContract, CallLog. Ang mga third-party na application ay maaari ring lumikha ng kanilang sariling mga provider para sa ligtas na pagpapalitan ng data. Ang bawat provider ay nirerehistro sa AndroidManifest.xml na may pagtukoy ng authority — isang natatanging string na bumubuo sa unang bahagi ng URI.

Paano Gumagana ang Content Provider

Ang Content Provider ay gumagana ayon sa modelong client-server. Ang provider ay gumaganap bilang server na nag-iimplementa ng anim na mandatoryong metodo: query, insert, update, delete, getType at onCreate. Ang client (ibang application) ay pumupunta sa provider sa pamamagitan ng ContentResolver na nagpapasa ng mga tawag sa kaukulang metodo ng provider sa pamamagitan ng IPC mechanism ng Android.

URI at authority

Ang bawat Content Provider ay tinutukoy ng URI ng schema content://. Halimbawa, content://com.example.app.provider/items. Ang unang bahagi authority (com.example.app.provider) ay nakatali sa klase ng provider sa manifest. Ang path /items ay tumutukoy sa table, at /items/5 — sa isang partikular na record na may ID=5.

Proseso ng pagtawag

Kapag ang isang application ay tumawag ng ContentResolver.query(URI), sinusuri ng Android ang mga pahintulot ng tumatawag na package, hinahanap ang provider sa pamamagitan ng authority at sinisimulan ang proseso nito kung hindi pa ito tumatakbo. Isinasagawa ng provider ang query at nagbabalik ng Cursor — isang object na naglalaman ng resulta at nagpapahintulot sa client na umulit sa mga record.

Mga Pangunahing Metodo ng Content Provider

Ang klase na ContentProvider ay nangangailangan ng implementasyon ng anim na abstract na metodo. Bawat metodo ay tumatanggap ng URI at nagbabalik ng resulta na naaayon sa uri ng operasyon. Tinatawag ng system ang mga metodong ito mula sa anumang proseso, kaya dapat silang maging thread-safe at hindi harangan ang execution nang mahabang panahon.

Metodo query

Ang metodo query ay tumatanggap ng URI, array ng mga column projection, string selection na may mga argumento, at order ng pag-uuri. Nagbabalik ito ng Cursor na may data. Sa implementasyon, kailangan i-parse ang URI gamit ang UriMatcher at isagawa ang kaukulang SQL query sa database.

Mga metodo insert, update, delete

Ang mga metodong ito ay nagbabago ng data sa imbakan. insert ay tumatanggap ng ContentValues — mga pares key-value — at nagbabalik ng URI ng bagong record. Ang update at delete ay tumatanggap ng selection para sa pag-filter ng mga record at nagbabalik ng bilang ng mga apektadong row. Pagkatapos baguhin ang data, ang provider ay dapat mag-notify sa pamamagitan ng ContentResolver.notifyChange.

MetodoLayuninIbinabalik
queryPagkuha ng data ayon sa URICursor o null
insertPagdaragdag ng bagong recordURI ng bagong record
updatePag-update ng mga umiiral na recordint (bilang ng row)
deletePagbura ng mga recordint (bilang ng row)
getTypeMIME type para sa URIString
onCreatePagsisimula ng providerboolean

ContentResolver at URI sa Android

ContentResolver — ay isang solong access point para sa pagtatrabaho sa lahat ng Content Provider sa system. Ang client application ay hindi kailanman direktang tumatawag ng mga metodo ng provider — sa pamamagitan lamang ng ContentResolver, na nakukuha ng Android mula sa context. Ang mga CRUD operation sa ContentResolver ay may parehong pangalan tulad ng sa provider, ngunit tumatanggap ng URI sa halip na direktang mga reference.

UriMatcher

Para sa pag-parse ng mga papasok na URI sa loob ng provider, ginagamit ang UriMatcher. Pinapayagan nito ang pagtugma ng URI sa isang numeric code — halimbawa, ang URI content://authority/items ay nagbibigay ng code 1, at ang content://authority/items/# — code 2. Ito ay nag-aalis ng pangangailangan para sa manu-manong pag-parse ng string URI sa bawat metodo.

kotlin
// Paggamit ng ContentResolver para ma-access ang mga contact
val uri = ContactsContract.Contacts.CONTENT_URI
val cursor = contentResolver.query(
    uri,
    arrayOf(ContactsContract.Contacts.DISPLAY_NAME),
    null, null, null
)
cursor?.use {
    while (it.moveToNext()) {
        val name = it.getString(it.getColumnIndexOrThrow(
            ContactsContract.Contacts.DISPLAY_NAME
        ))
        Log.d("Mga Contact", "Pangalan: $name")
    }
}

Ang Cursor ay dapat na isara pagkatapos gamitin — sa halimbawa sa itaas, ginagawa ito ng use (Kotlin extension function). Kung hindi isinara ang Cursor, magkakaroon ng memory leak dahil ito ay may hawak na reference sa data sa Binder pool. Para sa mga UI scenario, gamitin ang CursorLoader o Room na may LiveData/Flow.

Halimbawa ng Content Provider sa Kotlin

Ang paggawa ng sariling Content Provider ay nagsisimula sa pagmamana mula sa klase na ContentProvider. Ang provider ay gumagana sa SQLite database sa pamamagitan ng SQLiteOpenHelper at gumagamit ng UriMatcher para sa pagtukoy ng uri ng query. Tingnan natin ang isang minimal na implementasyon para sa pamamahala ng listahan ng mga tala.

Pagrehistro sa manifest

Ang provider ay nirerehistro sa AndroidManifest.xml sa loob ng application tag. Ang attribute authorities ay nagtatakda ng natatanging identifier, at exported ay tumutukoy kung ang ibang mga application ay maaaring pumunta sa provider. Kung walang exported=true, ang provider ay accessible lamang sa loob ng iyong application.

kotlin
// Halimbawa ng Content Provider para sa mga tala
class NotesProvider : ContentProvider() {

    companion object {
        const val AUTHORITY = "com.example.app.notes"
        const val NOTES_PATH = "notes"
        const val NOTES_URI = "content://$AUTHORITY/$NOTES_PATH"
        const val NOTES_ID = "content://$AUTHORITY/$NOTES_PATH/#"

        private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply {
            addURI(AUTHORITY, NOTES_PATH, 1)
            addURI(AUTHORITY, "$NOTES_PATH/#", 2)
        }
    }

    override fun query(uri: Uri, projection: Array<String>?,
        selection: String?, args: Array<String>?, sort: String?): Cursor? {
        return when (uriMatcher.match(uri)) {
            1 -> dbHelper.readableDatabase.query(TABLE_NOTES,
                projection, selection, args, null, null, sort)
            2 -> dbHelper.readableDatabase.query(TABLE_NOTES,
                projection, "_id=?", arrayOf(uri.lastPathSegment), null, null, null)
            else -> throw IllegalArgumentException("Unknown URI: $uri")
        }
    }

    override fun insert(uri: Uri, values: ContentValues?): Uri? {
        val id = dbHelper.writableDatabase.insert(TABLE_NOTES, null, values)
        context?.contentResolver?.notifyChange(uri, null)
        return ContentUris.withAppendedId(uri, id)
    }

    override fun delete(uri: Uri, selection: String?, args: Array<String>?): Int {
        val count = dbHelper.writableDatabase.delete(TABLE_NOTES, selection, args)
        context?.contentResolver?.notifyChange(uri, null)
        return count
    }

    // getType, update, onCreate ay inalis para sa kaiklian
}

Pagkatapos gawin ang klase, ang provider ay kailangang irehistro sa manifest na may mga attribute na android:authorities at android:exported (true kung ang provider ay pampubliko). Gumagawa ang system ng instance ng provider sa unang pag-access — ito ay nangyayari sa UI thread, kaya ang onCreate ay dapat na mabilis na maisagawa.

Pagprotekta ng Data sa pamamagitan ng mga Pahintulot

Ang Content Provider ay nagpapahintulot ng pamamahala ng access sa data sa dalawang antas: mga pahintulot sa pagbasa at mga pahintulot sa pagsulat. Ang mga ito ay itinakda sa manifest gamit ang mga attribute na android:readPermission at android:writePermission. Kung ang client application ay walang kaukulang pahintulot, tatanggihan ng system ang tawag na may SecurityException.

Pahintulot sa antas ng URI

Ang Android ay sumusuporta sa pansamantalang mga pahintulot sa pamamagitan ng mga flag na FLAG_GRANT_READ_URI_PERMISSION at FLAG_GRANT_WRITE_URI_PERMISSION. Ito ay kapaki-pakinabang kapag ang isang application ay nagpapasa ng URI ng file sa ibang application sa pamamagitan ng Intent — ang receiver ay nakakakuha lamang ng access sa partikular na URI para sa limitadong oras. Binabawi ng system ang pansamantalang pahintulot pagkatapos ng pagtatapos ng receiving application.

Para sa mga system provider, ang Android ay nangangailangan ng pagtukoy ng mga konkretong pahintulot sa manifest ng application. Halimbawa, para sa pag-access sa mga contact, kinakailangan ang READ_CONTACTS, para sa kalendaryo — READ_CALENDAR. Simula sa Android 6, ang mga pahintulot na ito ay hinihiling sa runtime, hindi sa pag-install.

Mga Madalas Itanong

Ano ang Content Provider sa Android?

Content Provider — ay isang komponent ng Android na nagbibigay ng pamantayang interface para sa pagpapalitan ng data sa pagitan ng mga application sa pamamagitan ng ContentResolver. Inaabstrakto nito ang paraan ng imbakan (SQLite, mga file, network) at nagbibigay ng ligtas na access sa data na may kontrol ng mga pahintulot sa pagbasa at pagsulat.

Ano ang authority sa Content Provider?

Authority — ay isang natatanging string identifier ng provider na tinukoy sa AndroidManifest.xml. Ito ay bumubuo ng unang bahagi ng URI content://authority/path at ginagamit ng system para sa pag-routing ng mga tawag ng ContentResolver sa tamang provider. Ang authority ay dapat na natatangi sa lahat ng mga application sa device.

Paano gumagana ang UriMatcher sa Content Provider?

UriMatcher ay nagtutugma ng mga URI sa mga numeric code. Nagdadagdag ka ng mga pattern sa pamamagitan ng addURI, pagkatapos ay tinatawagan ang match upang makuha ang code para sa papasok na URI. Ito ay nagpapahintulot sa mga metodo query, insert, update, delete na matukoy kung aling table o record ang hiniling at maisagawa ang kaukulang operasyon sa database.

Kailangan bang isara ang Cursor pagkatapos magtrabaho sa ContentResolver?

Oo, ang Cursor ay dapat na isara pagkatapos gamitin. Kung hindi isinara ang Cursor, magkakaroon ng memory leak dahil ito ay may hawak na Binder reference sa data ng provider. Sa Kotlin, gamitin ang function na use para sa awtomatikong pagsasara, at sa Java — try-with-resources o tawagan ang cursor.close() sa finally block.

Ano ang pagkakaiba ng Content Provider sa SQLiteDatabase?

Content Provider — ay isang komponent para sa inter-application access sa data, habang ang SQLiteDatabase ay panloob na imbakan ng isang application. Ang Content Provider ay nagbibigay ng URI interface at kontrol ng pahintulot, habang ang SQLiteDatabase ay direktang gumagana sa database nang walang mga mekanismo ng seguridad sa antas ng operating system.

Buod

  • Content Provider — ay ang pamantayang komponent ng Android para sa ligtas na pagpapalitan ng data sa pagitan ng mga application sa pamamagitan ng pinag-isang interface ng ContentResolver.
  • Ang URI ng schema na content://authority/path/id ay tumutukoy sa provider, table at partikular na record — bawat segment ay may mahigpit na layunin.
  • UriMatcher ay nagpapasimple ng pag-parse ng mga papasok na URI sa loob ng provider, inaalis ang manu-manong pag-parse ng mga string sa bawat CRUD metodo.
  • Ang provider ay nirerehistro sa AndroidManifest.xml na may mga attribute na authorities at exported — ito ang mekanismo ng system kung wala ito ang provider ay hindi gagana.
  • Ang ContentValues ay ipinapasa sa insert at update bilang isang set ng mga pares key-value, at ang Cursor ay ibinabalik mula sa query para sa pag-ulit sa mga resulta.
  • Ang mga pahintulot na readPermission at writePermission sa manifest ay kumokontrol ng access sa data, at ang FLAG_GRANT_URI_PERMISSION ay nagbibigay ng pansamantalang access sa isang partikular na URI.
  • Para sa asynchronous na pag-load ng data mula sa Content Provider, gamitin ang CursorLoader, Room na may ContentProvider o LoaderManager — ito ay pumipigil sa pagharang ng UI thread.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din