Content Provider एक Android घटक है जो एप्लिकेशनों के बीच डेटा तक पहुँच के लिए एकीकृत इंटरफ़ेस प्रदान करता है। यह भौतिक भंडारण (SQLite, फ़ाइलें, नेटवर्क स्रोत) को अमूर्त करता है और ContentResolver के माध्यम से सुरक्षित सूचना आदान-प्रदान सक्षम करता है। Android Developer Guide, 2026 के अनुसार, Content Provider Activity, Service और BroadcastReceiver के साथ Android एप्लिकेशन के चार मुख्य घटकों में से एक है। इसका कार्य डेटा को पढ़ने और लिखने की अनुमति नियंत्रण के साथ अन्य एप्लिकेशनों के लिए उपलब्ध कराना है।
मुख्य बिंदु
Content Provider एक Android घटक है जो केंद्रीकृत डेटा स्टोर तक पहुँच प्रबंधित करता है और इसे एकीकृत अनुबंध इंटरफ़ेस के माध्यम से अन्य एप्लिकेशनों को प्रदान करता है। यह भंडारण कार्यान्वयन विवरण छुपाता है: डेटा SQLite, फ़ाइल सिस्टम, क्लाउड में संग्रहीत किया जा सकता है या नेटवर्क अनुरोध का परिणाम हो सकता है।
Android में सिस्टम डेटा के लिए अंतर्निहित Content Providers शामिल हैं — ContactsContract, MediaStore, CalendarContract, CallLog। तृतीय-पक्ष एप्लिकेशन भी सुरक्षित डेटा आदान-प्रदान के लिए अपने स्वयं के प्रदाता बना सकते हैं। प्रत्येक प्रदाता authority के साथ AndroidManifest.xml में पंजीकृत होता है — एक अद्वितीय स्ट्रिंग जो URI का पहला भाग बनाती है।
Content Provider क्लाइंट-सर्वर मॉडल पर काम करता है। प्रदाता एक सर्वर के रूप में कार्य करता है जो छह अनिवार्य विधियों को लागू करता है: query, insert, update, delete, getType और onCreate। क्लाइंट (दूसरा एप्लिकेशन) ContentResolver के माध्यम से प्रदाता तक पहुँचता है, जो Android के IPC तंत्र के माध्यम से कॉल को प्रदाता की संबंधित विधियों में अनुवादित करता है।
प्रत्येक 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 लौटाता है — एक ऑब्जेक्ट जिसमें परिणाम होता है और क्लाइंट को रिकॉर्ड पर पुनरावृति करने की अनुमति देता है।
ContentProvider वर्ग को छह सारगर्भित विधियों के कार्यान्वयन की आवश्यकता होती है। प्रत्येक विधि एक URI स्वीकार करती है और संचालन प्रकार के अनुरूप परिणाम लौटाती है। सिस्टम इन विधियों को किसी भी प्रक्रिया से कॉल करता है, इसलिए ये थ्रेड-सुरक्षित होनी चाहिए और लंबे समय तक निष्पादन को अवरुद्ध नहीं करनी चाहिए।
query विधि एक URI, कॉलम की projection सरणी, तर्कों के साथ selection स्ट्रिंग और सॉर्ट ऑर्डर स्वीकार करती है। यह डेटा के साथ Cursor लौटाती है। कार्यान्वयन में, आपको UriMatcher का उपयोग करके URI को पार्स करना होगा और डेटाबेस में संबंधित SQL क्वेरी निष्पादित करनी होगी।
ये विधियाँ स्टोर में डेटा संशोधित करती हैं। insert ContentValues — कुंजी-मूल्य जोड़े — प्राप्त करती है और नए रिकॉर्ड का URI लौटाती है। update और delete रिकॉर्ड फ़िल्टर करने के लिए selection स्वीकार करती हैं और प्रभावित पंक्तियों की संख्या लौटाती हैं। डेटा बदलने के बाद, प्रदाता को ContentResolver.notifyChange के माध्यम से इसकी सूचना देनी होती है।
| विधि | उद्देश्य | वापसी |
|---|---|---|
| query | URI द्वारा डेटा प्राप्त करना | Cursor या null |
| insert | नया रिकॉर्ड जोड़ना | नए रिकॉर्ड का URI |
| update | मौजूदा रिकॉर्ड अपडेट करना | int (पंक्तियों की संख्या) |
| delete | रिकॉर्ड हटाना | int (पंक्तियों की संख्या) |
| getType | URI के लिए MIME प्रकार | String |
| onCreate | प्रदाता आरंभीकरण | boolean |
ContentResolver सिस्टम में सभी Content Providers के साथ काम करने के लिए एकल पहुँच बिंदु है। क्लाइंट एप्लिकेशन कभी भी सीधे प्रदाता विधियों को कॉल नहीं करता — केवल ContentResolver के माध्यम से, जिसे Android संदर्भ से प्राप्त करता है। ContentResolver में CRUD संचालन के नाम प्रदाता के समान होते हैं लेकिन सीधे संदर्भों के बजाय URI स्वीकार करते हैं।
प्रदाता के अंदर आने वाले URI को पार्स करने के लिए UriMatcher का उपयोग किया जाता है। यह URI को एक संख्यात्मक कोड से मैप करने की अनुमति देता है — उदाहरण के लिए, URI content://authority/items कोड 1 देता है, और content://authority/items/# कोड 2 देता है। यह प्रत्येक विधि में मैन्युअल URI स्ट्रिंग पार्सिंग की आवश्यकता को समाप्त करता है।
// संपर्कों तक पहुँचने के लिए 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 का उपयोग करें।
अपना स्वयं का Content Provider बनाना ContentProvider वर्ग को विस्तारित करने से शुरू होता है। प्रदाता SQLiteOpenHelper के माध्यम से SQLite डेटाबेस के साथ काम करता है और क्वेरी प्रकार निर्धारित करने के लिए UriMatcher का उपयोग करता है। नोट्स की सूची प्रबंधित करने के लिए न्यूनतम कार्यान्वयन पर विचार करें।
प्रदाता AndroidManifest.xml में application टैग के अंदर पंजीकृत होता है। authorities विशेषता एक अद्वितीय पहचानकर्ता निर्धारित करती है, और exported यह निर्धारित करता है कि क्या अन्य एप्लिकेशन प्रदाता तक पहुँच सकते हैं। exported=true के बिना, प्रदाता केवल आपके एप्लिकेशन के भीतर ही सुलभ है।
// नोट्स के लिए 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 के साथ कॉल को अस्वीकार कर देता है।
Android FLAG_GRANT_READ_URI_PERMISSION और FLAG_GRANT_WRITE_URI_PERMISSION फ़्लैग के माध्यम से अस्थायी अनुमतियों का समर्थन करता है। यह तब उपयोगी होता है जब कोई एप्लिकेशन Intent के माध्यम से किसी अन्य एप्लिकेशन को फ़ाइल URI भेजता है — प्राप्तकर्ता को केवल उस विशिष्ट URI तक सीमित समय के लिए पहुँच मिलती है। सिस्टम प्राप्तकर्ता एप्लिकेशन के समाप्त होने के बाद अस्थायी अनुमति रद्द कर देता है।
सिस्टम प्रदाताओं के लिए, Android को एप्लिकेशन मेनिफ़ेस्ट में विशिष्ट अनुमतियाँ निर्दिष्ट करने की आवश्यकता होती है। उदाहरण के लिए, संपर्कों तक पहुँचने के लिए READ_CONTACTS की आवश्यकता है, और कैलेंडर तक पहुँचने के लिए READ_CALENDAR की। Android 6 से शुरू होकर, ये अनुमतियाँ स्थापना के दौरान नहीं बल्कि रनटाइम पर अनुरोध की जाती हैं।
अक्सर पूछे जाने वाले प्रश्न
Content Provider एक Android घटक है जो ContentResolver के माध्यम से एप्लिकेशनों के बीच डेटा आदान-प्रदान के लिए एक मानक इंटरफ़ेस प्रदान करता है। यह भंडारण विधि (SQLite, फ़ाइलें, नेटवर्क) को अमूर्त करता है और पढ़ने और लिखने की अनुमति नियंत्रण के साथ सुरक्षित डेटा पहुँच सुनिश्चित करता है।
Authority प्रदाता की एक अद्वितीय पहचानकर्ता स्ट्रिंग है जो AndroidManifest.xml में निर्दिष्ट होती है। यह URI content://authority/path का पहला भाग बनाती है और सिस्टम द्वारा ContentResolver कॉल को सही प्रदाता तक रूट करने के लिए उपयोग की जाती है। Authority डिवाइस पर सभी एप्लिकेशनों के बीच अद्वितीय होनी चाहिए।
UriMatcher URI को संख्यात्मक कोड से मैप करता है। आप addURI के माध्यम से पैटर्न जोड़ते हैं, फिर आने वाले URI के लिए कोड प्राप्त करने के लिए match को कॉल करते हैं। यह query, insert, update, delete विधियों को यह निर्धारित करने की अनुमति देता है कि कौन सी तालिका या रिकॉर्ड अनुरोधित है और डेटाबेस में संबंधित संचालन निष्पादित करता है।
हाँ, उपयोग के बाद Cursor को हमेशा बंद किया जाना चाहिए। यदि Cursor बंद नहीं किया जाता है, तो मेमोरी लीक होती है क्योंकि यह प्रदाता के डेटा पर Binder संदर्भ रखता है। Kotlin में, स्वचालित बंद करने के लिए use फ़ंक्शन का उपयोग करें, और Java में — try-with-resources या finally ब्लॉक में cursor.close() का उपयोग करें।
Content Provider एप्लिकेशनों के बीच डेटा पहुँच के लिए एक घटक है, जबकि SQLiteDatabase एक ही एप्लिकेशन के लिए आंतरिक भंडारण तंत्र है। Content Provider URI इंटरफ़ेस और अनुमति नियंत्रण प्रदान करता है, जबकि SQLiteDatabase OS-स्तरीय सुरक्षा तंत्र के बिना सीधे डेटाबेस के साथ काम करता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें