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 ایک یوٹیلیٹی کلاس ہے جو آنے والی URIs کو پارس کرتی ہے اور تعین کرتی ہے کہ کون سی ٹیبل یا قطار درخواست کی گئی ہے۔
  • پڑھنے اور لکھنے کی اجازتیں مینی فیسٹ میں متعین کی جاتی ہیں اور انسٹالیشن کے دوران صارف سے درخواست کی جاتی ہیں۔
  • 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

فراہم کنندہ کے اندر آنے والی URIs کو پارس کرنے کے لیے 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 URIs کو عددی کوڈز سے نقشہ بناتا ہے۔ آپ 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 فراہم کنندہ کے اندر آنے والی URIs کی پارسنگ کو آسان بناتا ہے، ہر 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں