Content Provider: घटक आर्किटेक्चर और कार्य सिद्धांत

लेखक: IT Sectr प्रकाशित: 2026-06-17 पढ़ने का समय: 8 मिनट

Content Provider एक Android घटक है जो एप्लिकेशनों के बीच डेटा तक पहुँच के लिए एकीकृत इंटरफ़ेस प्रदान करता है। यह भौतिक भंडारण (SQLite, फ़ाइलें, नेटवर्क स्रोत) को अमूर्त करता है और ContentResolver के माध्यम से सुरक्षित सूचना आदान-प्रदान सक्षम करता है। Android Developer Guide, 2026 के अनुसार, Content Provider Activity, Service और BroadcastReceiver के साथ Android एप्लिकेशन के चार मुख्य घटकों में से एक है। इसका कार्य डेटा को पढ़ने और लिखने की अनुमति नियंत्रण के साथ अन्य एप्लिकेशनों के लिए उपलब्ध कराना है।

मुख्य बिंदु

  • Content Provider ContentResolver इंटरफ़ेस के माध्यम से अंतर-एप्लिकेशन डेटा आदान-प्रदान के लिए एक मानक Android घटक है।
  • URI (content://) एक तालिका या रिकॉर्ड की पहचान करता है और प्रदाता के साथ सभी CRUD संचालन के लिए उपयोग किया जाता है।
  • UriMatcher एक उपयोगिता वर्ग है जो आने वाले URI को पार्स करता है और निर्धारित करता है कि कौन सी तालिका या पंक्ति अनुरोधित है।
  • अनुमतियाँ पढ़ने और लिखने के लिए मेनिफ़ेस्ट में निर्धारित की जाती हैं और स्थापना के दौरान उपयोगकर्ता से अनुरोध की जाती हैं।
  • CursorLoader या Content Provider के साथ Room UI थ्रेड को ब्लॉक किए बिना प्रदाता से अतुल्यकालिक डेटा लोडिंग सुनिश्चित करते हैं।

Content Provider क्या है?

Content Provider एक Android घटक है जो केंद्रीकृत डेटा स्टोर तक पहुँच प्रबंधित करता है और इसे एकीकृत अनुबंध इंटरफ़ेस के माध्यम से अन्य एप्लिकेशनों को प्रदान करता है। यह भंडारण कार्यान्वयन विवरण छुपाता है: डेटा SQLite, फ़ाइल सिस्टम, क्लाउड में संग्रहीत किया जा सकता है या नेटवर्क अनुरोध का परिणाम हो सकता है।

Android में सिस्टम डेटा के लिए अंतर्निहित Content Providers शामिल हैं — ContactsContract, MediaStore, CalendarContract, CallLog। तृतीय-पक्ष एप्लिकेशन भी सुरक्षित डेटा आदान-प्रदान के लिए अपने स्वयं के प्रदाता बना सकते हैं। प्रत्येक प्रदाता authority के साथ AndroidManifest.xml में पंजीकृत होता है — एक अद्वितीय स्ट्रिंग जो URI का पहला भाग बनाती है।

Content Provider कैसे काम करता है

Content Provider क्लाइंट-सर्वर मॉडल पर काम करता है। प्रदाता एक सर्वर के रूप में कार्य करता है जो छह अनिवार्य विधियों को लागू करता है: query, insert, update, delete, getType और onCreate। क्लाइंट (दूसरा एप्लिकेशन) ContentResolver के माध्यम से प्रदाता तक पहुँचता है, जो Android के IPC तंत्र के माध्यम से कॉल को प्रदाता की संबंधित विधियों में अनुवादित करता है।

URI और authority

प्रत्येक Content Provider content:// योजना के URI द्वारा पहचाना जाता है। उदाहरण के लिए, content://com.example.app.provider/items। पहला भाग authority (com.example.app.provider) मेनिफ़ेस्ट में प्रदाता वर्ग से बंधा होता है। पथ /items एक तालिका को इंगित करता है, जबकि /items/5 ID=5 वाले विशिष्ट रिकॉर्ड को इंगित करता है।

कॉल प्रक्रिया

जब कोई एप्लिकेशन ContentResolver.query(URI) को कॉल करता है, Android कॉलिंग पैकेज की अनुमतियाँ जाँचता है, authority द्वारा प्रदाता ढूँढता है और यदि वह पहले से नहीं चल रहा है तो उसकी प्रक्रिया शुरू करता है। प्रदाता क्वेरी निष्पादित करता है और Cursor लौटाता है — एक ऑब्जेक्ट जिसमें परिणाम होता है और क्लाइंट को रिकॉर्ड पर पुनरावृति करने की अनुमति देता है।

Content Provider की मुख्य विधियाँ

ContentProvider वर्ग को छह सारगर्भित विधियों के कार्यान्वयन की आवश्यकता होती है। प्रत्येक विधि एक URI स्वीकार करती है और संचालन प्रकार के अनुरूप परिणाम लौटाती है। सिस्टम इन विधियों को किसी भी प्रक्रिया से कॉल करता है, इसलिए ये थ्रेड-सुरक्षित होनी चाहिए और लंबे समय तक निष्पादन को अवरुद्ध नहीं करनी चाहिए।

query विधि

query विधि एक URI, कॉलम की projection सरणी, तर्कों के साथ selection स्ट्रिंग और सॉर्ट ऑर्डर स्वीकार करती है। यह डेटा के साथ Cursor लौटाती है। कार्यान्वयन में, आपको UriMatcher का उपयोग करके URI को पार्स करना होगा और डेटाबेस में संबंधित SQL क्वेरी निष्पादित करनी होगी।

insert, update, delete विधियाँ

ये विधियाँ स्टोर में डेटा संशोधित करती हैं। insert ContentValues — कुंजी-मूल्य जोड़े — प्राप्त करती है और नए रिकॉर्ड का URI लौटाती है। update और delete रिकॉर्ड फ़िल्टर करने के लिए selection स्वीकार करती हैं और प्रभावित पंक्तियों की संख्या लौटाती हैं। डेटा बदलने के बाद, प्रदाता को ContentResolver.notifyChange के माध्यम से इसकी सूचना देनी होती है।

विधिउद्देश्यवापसी
queryURI द्वारा डेटा प्राप्त करनाCursor या null
insertनया रिकॉर्ड जोड़नानए रिकॉर्ड का URI
updateमौजूदा रिकॉर्ड अपडेट करनाint (पंक्तियों की संख्या)
deleteरिकॉर्ड हटानाint (पंक्तियों की संख्या)
getTypeURI के लिए MIME प्रकारString
onCreateप्रदाता आरंभीकरणboolean

Android में ContentResolver और URI

ContentResolver सिस्टम में सभी Content Providers के साथ काम करने के लिए एकल पहुँच बिंदु है। क्लाइंट एप्लिकेशन कभी भी सीधे प्रदाता विधियों को कॉल नहीं करता — केवल ContentResolver के माध्यम से, जिसे Android संदर्भ से प्राप्त करता है। ContentResolver में CRUD संचालन के नाम प्रदाता के समान होते हैं लेकिन सीधे संदर्भों के बजाय URI स्वीकार करते हैं।

UriMatcher

प्रदाता के अंदर आने वाले URI को पार्स करने के लिए UriMatcher का उपयोग किया जाता है। यह URI को एक संख्यात्मक कोड से मैप करने की अनुमति देता है — उदाहरण के लिए, URI content://authority/items कोड 1 देता है, और content://authority/items/# कोड 2 देता है। यह प्रत्येक विधि में मैन्युअल URI स्ट्रिंग पार्सिंग की आवश्यकता को समाप्त करता है।

kotlin
// संपर्कों तक पहुँचने के लिए ContentResolver का उपयोग करना
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("संपर्क", "नाम: $name")
    }
}

उपयोग के बाद Cursor को हमेशा बंद किया जाना चाहिए — ऊपर के उदाहरण में, use फ़ंक्शन (Kotlin एक्सटेंशन) ऐसा करता है। यदि Cursor बंद नहीं किया जाता है, तो मेमोरी लीक होती है क्योंकि यह Binder पूल में डेटा का संदर्भ रखता है। UI परिदृश्यों के लिए, LiveData/Flow के साथ CursorLoader या Room का उपयोग करें।

Kotlin में Content Provider का उदाहरण

अपना स्वयं का Content Provider बनाना ContentProvider वर्ग को विस्तारित करने से शुरू होता है। प्रदाता SQLiteOpenHelper के माध्यम से SQLite डेटाबेस के साथ काम करता है और क्वेरी प्रकार निर्धारित करने के लिए UriMatcher का उपयोग करता है। नोट्स की सूची प्रबंधित करने के लिए न्यूनतम कार्यान्वयन पर विचार करें।

मेनिफ़ेस्ट में पंजीकरण

प्रदाता AndroidManifest.xml में application टैग के अंदर पंजीकृत होता है। authorities विशेषता एक अद्वितीय पहचानकर्ता निर्धारित करती है, और exported यह निर्धारित करता है कि क्या अन्य एप्लिकेशन प्रदाता तक पहुँच सकते हैं। exported=true के बिना, प्रदाता केवल आपके एप्लिकेशन के भीतर ही सुलभ है।

kotlin
// नोट्स के लिए Content Provider का उदाहरण
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 संक्षिप्तता के लिए छोड़े गए
}

प्रदाता वर्ग बनाने के बाद, इसे android:authorities और android:exported विशेषताओं के साथ मेनिफ़ेस्ट में पंजीकृत किया जाना चाहिए (true यदि प्रदाता सार्वजनिक है)। सिस्टम पहली पहुँच पर प्रदाता का एक उदाहरण बनाता है — यह UI थ्रेड में होता है, इसलिए onCreate को जल्दी निष्पादित होना चाहिए।

अनुमतियों के माध्यम से डेटा सुरक्षा

Content Provider दो स्तरों पर डेटा तक पहुँच प्रबंधित करने की अनुमति देता है: पढ़ने की अनुमतियाँ और लिखने की अनुमतियाँ। ये मेनिफ़ेस्ट में android:readPermission और android:writePermission विशेषताओं के साथ निर्धारित की जाती हैं। यदि क्लाइंट एप्लिकेशन के पास संबंधित अनुमति नहीं है, तो सिस्टम SecurityException के साथ कॉल को अस्वीकार कर देता है।

URI-स्तर अनुमतियाँ

Android FLAG_GRANT_READ_URI_PERMISSION और FLAG_GRANT_WRITE_URI_PERMISSION फ़्लैग के माध्यम से अस्थायी अनुमतियों का समर्थन करता है। यह तब उपयोगी होता है जब कोई एप्लिकेशन Intent के माध्यम से किसी अन्य एप्लिकेशन को फ़ाइल URI भेजता है — प्राप्तकर्ता को केवल उस विशिष्ट URI तक सीमित समय के लिए पहुँच मिलती है। सिस्टम प्राप्तकर्ता एप्लिकेशन के समाप्त होने के बाद अस्थायी अनुमति रद्द कर देता है।

सिस्टम प्रदाताओं के लिए, Android को एप्लिकेशन मेनिफ़ेस्ट में विशिष्ट अनुमतियाँ निर्दिष्ट करने की आवश्यकता होती है। उदाहरण के लिए, संपर्कों तक पहुँचने के लिए READ_CONTACTS की आवश्यकता है, और कैलेंडर तक पहुँचने के लिए READ_CALENDAR की। Android 6 से शुरू होकर, ये अनुमतियाँ स्थापना के दौरान नहीं बल्कि रनटाइम पर अनुरोध की जाती हैं।

अक्सर पूछे जाने वाले प्रश्न

Android में Content Provider क्या है?

Content Provider एक Android घटक है जो ContentResolver के माध्यम से एप्लिकेशनों के बीच डेटा आदान-प्रदान के लिए एक मानक इंटरफ़ेस प्रदान करता है। यह भंडारण विधि (SQLite, फ़ाइलें, नेटवर्क) को अमूर्त करता है और पढ़ने और लिखने की अनुमति नियंत्रण के साथ सुरक्षित डेटा पहुँच सुनिश्चित करता है।

Content Provider में authority क्या है?

Authority प्रदाता की एक अद्वितीय पहचानकर्ता स्ट्रिंग है जो AndroidManifest.xml में निर्दिष्ट होती है। यह URI content://authority/path का पहला भाग बनाती है और सिस्टम द्वारा ContentResolver कॉल को सही प्रदाता तक रूट करने के लिए उपयोग की जाती है। Authority डिवाइस पर सभी एप्लिकेशनों के बीच अद्वितीय होनी चाहिए।

Content Provider में UriMatcher कैसे काम करता है?

UriMatcher URI को संख्यात्मक कोड से मैप करता है। आप addURI के माध्यम से पैटर्न जोड़ते हैं, फिर आने वाले URI के लिए कोड प्राप्त करने के लिए match को कॉल करते हैं। यह query, insert, update, delete विधियों को यह निर्धारित करने की अनुमति देता है कि कौन सी तालिका या रिकॉर्ड अनुरोधित है और डेटाबेस में संबंधित संचालन निष्पादित करता है।

क्या ContentResolver के साथ काम करने के बाद Cursor को बंद करना आवश्यक है?

हाँ, उपयोग के बाद Cursor को हमेशा बंद किया जाना चाहिए। यदि Cursor बंद नहीं किया जाता है, तो मेमोरी लीक होती है क्योंकि यह प्रदाता के डेटा पर Binder संदर्भ रखता है। Kotlin में, स्वचालित बंद करने के लिए use फ़ंक्शन का उपयोग करें, और Java में — try-with-resources या finally ब्लॉक में cursor.close() का उपयोग करें।

Content Provider, SQLiteDatabase से कैसे भिन्न है?

Content Provider एप्लिकेशनों के बीच डेटा पहुँच के लिए एक घटक है, जबकि SQLiteDatabase एक ही एप्लिकेशन के लिए आंतरिक भंडारण तंत्र है। Content Provider URI इंटरफ़ेस और अनुमति नियंत्रण प्रदान करता है, जबकि SQLiteDatabase OS-स्तरीय सुरक्षा तंत्र के बिना सीधे डेटाबेस के साथ काम करता है।

सारांश

  • Content Provider एकीकृत ContentResolver इंटरफ़ेस के माध्यम से एप्लिकेशनों के बीच सुरक्षित डेटा आदान-प्रदान के लिए एक मानक Android घटक है।
  • content://authority/path/id योजना का URI प्रदाता, तालिका और विशिष्ट रिकॉर्ड की पहचान करता है — प्रत्येक खंड का एक सख्त उद्देश्य है।
  • UriMatcher प्रदाता के अंदर आने वाले URI के पार्सिंग को सरल बनाता है, प्रत्येक CRUD विधि में मैन्युअल स्ट्रिंग पार्सिंग को समाप्त करता है।
  • प्रदाता AndroidManifest.xml में authorities और exported विशेषताओं के साथ पंजीकृत होता है — यह एक सिस्टम तंत्र है जिसके बिना प्रदाता काम नहीं करेगा।
  • ContentValues insert और update में कुंजी-मूल्य जोड़े के रूप में पास किए जाते हैं, और परिणामों पर पुनरावृति के लिए query से Cursor लौटाया जाता है।
  • मेनिफ़ेस्ट में readPermission और writePermission डेटा तक पहुँच को नियंत्रित करते हैं, जबकि FLAG_GRANT_URI_PERMISSION किसी विशिष्ट URI तक अस्थायी पहुँच प्रदान करता है।
  • Content Provider से अतुल्यकालिक डेटा लोडिंग के लिए, CursorLoader, ContentProvider के साथ Room या LoaderManager का उपयोग करें — यह UI थ्रेड को ब्लॉक होने से रोकता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें