میخوای وارد بازار کار بشی و محصولات خودت رو بفرشی همین الان ثبت نام کن
0

مفهوم Content Provider در اندروید

با سلام خدمت دوستان عزیز در این مقاله قصد داریم در مورد مفهوم Content Provider در اندروید مطالبی را عنوان کنیم

Content Provider چیست و مفهوم Content Provider در اندروید چیست ؟

جهت به اشتراک گذاری داده ها بین چندین اپلیکیشن ، می توانید از Content Provider در اندروید استفاده نمایید. می توانید به Provider به چشم یک منبع داده ای نگاه کنید که اطلاعات موجود در آن به اپلیکیشنی که از آن استفاده می کند ، وابسته نمی باشد. این امکان وجود دارد که از Provider مانند یک دیتابیس کوئری بگیرید ، داده های آن را بروز رسانی و حتی حذف نمایید. علاوه بر آن provider ها قابلیتی دارند که به آن ها اجازه ی ذخیره داده ها در فایل ، دیتابیس و شبکه را می دهد.

Provider اطلاعات را بر اساس URI مربوطه کپسوله سازی می کند. هر URI ای که با //:content شروع می شود در واقع به منابع و محتوایی اشاره دارد که از طریق Provider قابل دسترسی است.

آدرس URI یک منبع به شما این امکان را می دهد تا از طریق Provider عملیات ساده ی CRUD (ایجاد، بازیابی، بروز رسانی و حذف) را بر روی داده های منبع مورد نظر اجرا نمایید.

همان طور که قبلا اشاره شد، provider داده های مورد نیاز اپلیکیشن را در اختیار آن قرار می دهد. این داده ها ممکن است در یک دیتابیس SQLite ، در سیستم فایل ، داخل فایل های flat یا بر روی سرور راه دور ( remote server ) مستقر باشند.

اگرچه از Provider می توان برای دسترسی به داده ها در یک اپلیکیشن نیز استفاده کرد، اما معمولا توسعه دهندگان از آن برای به اشتراک گذاری داده ها بین چندین اپلیکیشن بهره می گیرند. داده های اپلیکیشن به صورت پیش فرض دارای سطح دسترسی private می باشند. اینجا است که content provider به یاری شما می آید؛ این کامپوننت نرم افزاری دسترسی به داده های سایر اپلیکیشن ها را بر اساس یک interface ساخت یافته به راحتی مهیا می سازد.

Content provider را می بایست داخل فایل تنظیمات اپلیکیشن اندرویدی خود ( manifest ) تعریف نمایید.

 


قالب پایه ای و الگوی تعریف URI جهت دسترسی به Content Provider

برای دسترسی به content provider می بایست ابتدا پیشوند متعارف //: content و سپس namespace مربوط به  provider را ارائه نمایید ( namespace همان نام content provider حامل داده های مورد نظر می باشد.) لازم است namespace را داخل فایل manifest ، تگ provider و در attribute ( خصیصه ) android:authorities  تعریف و مقداردهی نمایید. مثال content://test

در زیر بخش ها مختلف یک URI را شرح می دهیم.

قالب و ساختار کلی URI به این صورت می باشد:

<standard_prefix>://<authority>/<data_path>/<id>

standard prefix .1 یا پیشوندی که همیشه ثابت است: //:.content

authority .2 یا نام content provider .
data path .3 نوع درخواست را مشخص می کند.
id .4 رکورد مورد نظر را مشخص می کند.

URI پایه امکان دسترسی به مجموعه ای از منابع (برای مثال کل یک جدول) را فراهم می کند.
چنانچه در بخش نهایی URI شناسه ی نمونه ذکر شود، در آن صورت تنها content ای که id آن ذکر شده، قابل دسترسی می باشد. مثال: .content://test/2


دسترسی به content provider

از آنجایی که داشتن URI های یک provider برای دسترسی به آن ضروی است، توصیه می شود
URI ها را داخل constant هایی با سطح دسترسی public قرار داده، آن ها را به صورت مستند در اختیار دیگر توسعه دهندگان قرار دهید

بسیاری از منابع داده ای اندروید همچون contacts ( اطلاعات مخاطبین ) از طریق content provider قابل دسترسی هستند.

 


پیاده سازی content provider اختصاصی 

به منظور ایجاد content provider اختصاصی خود بایستی یک کلاس که از android.content.ContentProvider ارث می برد ( extend می کند)، ایجاد نمایید. سپس این کلاس را به عنوان content provider در فایل تنظیمات ( Android manifest ) معرفی کنید. تگ مربوطه در فایل تنظیمات باید خصیصه ( android:authorities (attribute را داشته باشد. مقدار این attribute را برابر اسم content provider قرار می دهید. Authority در واقع مبنای URI را تشکیل داده و برای دسترسی به content provider مورد استفاده قرار می گیرد، از این رو باید منحصر بفرد باشد.

 

<provider android:authorities="de.vogella.android.todos.contentprovider"
android:name=".contentprovider.MyTodoContentProvider" >
</provider>

در بدنه ی Content provider شما باید تعداد زیادی متد را پیاده سازی کنید. برای مثال می توان اشاره کرد. در صورتی که از onCreate() و getType() ،delete() ، update() ، insert() ، query() به متد خاصی پشتیبانی نمی کنید، توصیه می شود () UnsupportedOperationException را فراخوانی نمایید. 

متد () query در خروجی یک آبجکت Cursor برمی گرداند.

 


Content provider و مبحث امنیت

تا ویرایش ۴٫۲ اندروید، content provider به صورت پیش فرض برای دیگر اپلیکیشن های اندرویدی قابل دسترسی می باشد. اما از ورژن ۴٫۲ به بعد اندروید، برای دسترسی به content provider لازم است آن را به صورت صریح export نمایید.

به منظور تنظیم قابلیت رویت و دسترسی content provider خود، کافی است پارامتر android:exported=false|true را در تعریف  content provider خود داخل فایل AndroidManifest.xml ذکر نمایید .

نکته: توصیه می شود پارامتر android:exported را همیشه در فایل تنظیمات قید کنید تا رفتار اپلیکیشن در ورژن های مختلف اندروید یکسان باشد.


 Thread safety (برطرف سازی مشکل همزمانی با استفاده از کلیدواژه ی  synchronized )

چنانچه مستقیما با دیتابیس تعامل داشته باشید و همزمان از چند thread در دیتابیس مقادیری نوشته شوند (از چند thread همزمان چندین writer وجود داشته باشد) در آن صورت طبیعتا با مشکل مدیریت همروندی و concurrency مواجه می شوید.

یک content provider می تواند همزمان از چندین برنامه مورد دسترسی قرار گیرد. به این دلیل لازم است دسترسی thread-safe را پیاده سازی نمایید. آسان ترین راه، استفاده از کلیدواژه ی synchronized در مقابل تمامی متدهای provider است. بدین وسیله تنها یک thread در لحظه می تواند به این متدها دسترسی داشته باشد.

( thread-safe= دسترسی چند thread به یک data structure بدون اینکه در پروسه ی کاری thread ها اختلالی به وجود آید.)

اگر لزومی ندارد که اندروید دسترسی به provider را sync کند، مقدار خصیصه (attribute) = android:multiprocess را در تگ < provider> داخل فایل تنظیمات اپلیکیشن خود برابر true قرار دهید. این کار سبب می شود در هر یک از process های مربوط به کلاینت (پاسخ دهی به درخواست های کاربر)، یک نمونه از provider ایجاد شده و نیاز به اجرای IPC به کلی از میان برداشته شود (  IPC = عبارت است از مجموعه ای از روش ها برای تبادل داده بین چندین پردازش خرد و کوچک/ thread بنابراین هر یک از این روشها می تواند برای ارتباط بین یک یا چند پردازش بکار رود).

 


امیدواریم آموزش مفهوم Content Provider در اندروید استودیو نیز برای شما مفید واقع شده باشد و ادامه آموزش برنامه نویسی اندروید رو دنبال کنید . برای مطالعه پست‌ها بیشتر ، ما را در مدرسه کدنویسی تلگرام  و یا در تی جوان اینستاگرام دنبال کنید.

نظراتتون رو زیر همین پست با ما به اشتراک بگذارید.
ارسال دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

×

سلام کاربر عزیز

هر سوالی دارید در این بخش هستیم تا شما رو راهنمائی کنیم

روی لوگومون کلیک کنید

× چطور میتونم کمکتون کنم؟