دوستان گرامی ،وب مستران عزیز، با اموزش امروز که کدرمورد اندروید درخدمت شماهستیم. همانطور که میدانید یک مولفه تامین کننده­ ی محتوا (content providers)، در صورت درخواست، داده های یک اپلیکیشن را به سایر اپلیکیشن ها ارائه می دهد. این درخواست ها به وسیله ­ی متدهایی از کلاس ContentResolver اداره می شوند. یک تامین کننده­ی محتوا می تواند از روش های مختلفی برای ذخیره­ی داده های خود استفاده کند و داده می تواند در یک پایگاه داده، در فایل ها یا حتی بر روی یک شبکه ذخیره شود.

هر اپلیکیشن اندرویدی فرایندهای خود را با مجوز های مربوط به خودش اجرا می کند. این کار باعث می شود که داده های یک اپلیکیشن از سایر اپلیکیشن ها پنهان باشد. ولی گاهی اوقات لازم است که داده ای در بین اپلیکیشن ها به اشتراک گذاشته شود. اینجا جایی است که تامین کنندگان محتوا بسیار مفید واقع می شوند.

تامین کنندگان محتوا به شما اجازه می دهند که محتوای مورد نیاز را در یک جا متمرکز کنید و اپلیکیشن های بسیاری بتوانند در صورت نیاز به آن دسترسی داشته باشند. رفتار یک تامین کننده­ ی محتوا بسیار شبیه به یک پایگاه داده است که شما می توانید با استفاده از متدهای query()،update() ، insert() و delete() بر روی آن پرس و جو ایجاد کنید، محتوای آن را ویرایش کنید و همچنین محتوای آن را اضافه یا حذف کنید. در بسیاری از موارد این داده در یک پایگاه داده­ ی SQlite ذخیره می شود.

یک تامین کننده­ ی محتوا به صورت یک زیر کلاس از کلاس ContentProvider پیاده سازی می شود و باید مجموعه­ ی استانداردی از API ها را پیاده سازی کند که سایر اپلیکیشن ها را قادر به اجرای تراکنش ها می کند.

URI های محتوا

برای ارسال پرس و جو به یک تامین کننده ­ی محتوا، شما باید رشته­ ی پرس و جو را به صورت یک URI با فرمت زیر، مشخص کنید.

در اینجا جزئیات بخش های مختلف URI ارائه شده است .

بخش

توصیف

Prefix (پیشوند)

این بخش همیشه به صورت content:// تنظیم می شود.

Authority (منبع)

این بخش نام تامین کننده­ی محتوا را تعیین می­کند. برای مثال contacts، browser و غیره. برای تامین کنندگان محتوای شخص ثالث، این بخش می تواند به صورت یک نام کاملا توصیفی مانند com.tutorialspoint.statusprovider باشد.

data_type (نوع داده)

این بخش نشان دهنده­ی نوع داده ای است که این تامین کننده­ی محتوای خاص ایجاد میکند. برای مثال، اگر شما همه­ی شماره تماس ها را از تامین کننده محتوای Contacts دریافت کنید، آنگاه مسیر داده people خواهد بود و URI آن شبیه به این خواهد بود: content://contacts/people

id (شناسه)

این بخش رکورد خاص مورد تقاضا را مشخص می کند. برای مثال، اگر شما شماره تماس نفر ۵ ام را از تامین کننده محتوا درخواست کنید، آنگاه URI شبیه به این خواهد شد: content://contacts/people/5

ایجاد تامین کننده­ ی محتوا

این بخش شامل تعدادی گام ساده برای ایجاد تامین کننده محتوای مربوط به خودتان است.

اول از همه، شما باید یک کلاس Content Provider را ایجاد کنید که کلاس ContentProviderbase class را توسعه (extend) می دهد.

در گام دوم، شما باید آدرس UIR مربوط به تامین کننده محتوای خود را تعریف کنید که برای دسترسی به محتوا مورد استفاده قرار می گیرد.

سپس، شما باید پایگاه داده­ی خود را برای ذخیره­ی محتوا ایجاد کنید. معمولا اندروید از پایگاه داده­ ی SQLite استفاده می کند و فریم ورک نیازمند override کردن متد onCreate() است، که از متد SQLite Open Helper، برای ایجاد یا بازکردن پایگاه داده­ی تامین کننده­ ی محتوا استفاده میکند. زمانی که اپلیکیشن شما راه اندازی می شود، گرداننده (hander) مربوط به متد onCreate() هر کدام از Content Provider های آن، در نخ اجرایی اصلی اپلیکیشن فراخوانی می شوند.

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

در نهایت، باید با استفاده از تگ ، Content Provider خود را در فایل فعالیت خود ثبت کنید.

در اینجا متد هایی در کلاس Content Provider، که شما باید برای کار کردن Content Provider خودتان، آنها را override کنید، لیست شده اند.

onCreate() این متد زمانی فراخوانی می شود که تامین کننده شروع به کار می کند.

query() این متد درخواستی را از یک کلاینت دریافت می کند، نتیجه به صورت یک شی Cursor برگردانده می شود.

insert() این متد یک رکورد جدید را در یک تامین کننده محتوا درج می کند.

delete() این متد یک رکورد موجود را از یک تامین کننده محتوا حذف می کند.

update() این متد یک رکورد موجود را در یک تامین کننده محتوا به روز رسانی می کند.

getType() این متد نوع MIME داده را در URI مورد نظر برمی گرداند.

مثال

این مثال شرح میدهد که شما چگونه می توانید ContentProvider خودتان را ایجاد کنید. بیایید مراحل زیر را شبیه به مراحل ایجاد Hello World Example دنبال کنیم.

مرحله

توصیف

۱

از Eclipse IDE برای ایجاد یک اپلیکیشن اندرویدی استفاده کنید و آن را، تحت پکیج com.example.mycontentprovider همراه با یک فعالیت خالی، MyContentProvider بنامید.

۲

فایل فعالیت اصلی MainActivity.java را برای اضافه کردن متدهای جدید onClickAddName() و onClickRetrieveStudents() تغییر دهید.

۳

برای تعریف تامین کننده­ و متدهای مربوط به آن، یک فایل جاوای جدید به نام StudentsProvider.java تحت پکیج com.example.mycontentprovider ایجاد کنید.

۴

تامین کننده­ی محتوای خود را با استفاده از تگ <provider…/> در فایل AndroidManifest.xml پروژه تان ثبت کنید.

۵

محتوای پیش فرض فایل res/layout/activity_main.xml را برای وارد کردن یک واسط کاربری کوچک برای اضافه کردن رکودهای مربوط به دانش آموزان، تغییر دهید.

۶

ثابت های مورد نیاز را در فایل res/values/strings.xml تعریف کنید.

۷

برای راه اندازی امولاتور اندروید اپلیکیشن را اجرا کنید و نتایج تغییرات اعمال شده در اپلیکیشن را بررسی کنید.

در بخش زیر محتوای تغییر یافته­ ی فایل فعالیت اصلی

src/com.example.mycontentprovider/MainActivity.java ارائه شده است. این فایل می تواند شامل هر کدام از متدهای اصلی چرخه حیات باشد. ما دو متد جدید onClickAddName() و onClickRetrieveStudents() را برای مدیریت تعامل کاربر با اپلیکیشن، اضافه کرده ایم.

فایل جدید StudentsProvider.java را تحت پکیج com.example.mycontentprovider ایجاد کنید . در بخش زیر محتوی فایل src/com.example.mycontentprovider/StudentsProvider.java ارائه شده است.

در بخش زیر محتوای تغییر یافته­ ی فایل AndroidManifest.xml ارائه شده است. در اینجا ما تگ را برای وارد کردن تامین کننده محتوایمان اضافه کرده ایم.

در بخش زیر محتوای فایل res/layout/activity_main.xml برای ایجاد دو دکمه جهت اضافه کردن نام دانش آموزان و بازیابی دانش آموزان، آورده شده است.

مطمئن شوید که فایل res/values/strings.xml شما دارای محتوای زیر است.

اکنون می خواهیم اپلیکیشن MyContentProvider را اجرا کنیم. من فرض می­ کنم که شما AVD خود را در زمان نصب محیط ایجاد کرده باشید. برای اجرای اپلیکیشن از Eclipse، یکی از فایل های فعالیت پروژه­ ی خود را باز کنید و بر روی آیکن Run از نوار ابزار کلیک کنید. Eclipse، اپلیکیش را بر روی AVD شما نصب می کند و آن را آغاز می کند و در صورتی که همه­ ی موارد مربوط به تنظیمات و برنامه شما درست باشد، صفحه امولاتور زیر برای شما نمایش داده می شود، شکیبا باشید چون این کار بسته به سرعت کامپیوتر شما قدری زمان می برد.

اکنون فیلدهای Name و Grade دانش آموز را پر کنید و نهایتا بر روی دکمه Add Name کلیک کنید. این کار رکورد دانش آموز را به پایگاه داده­ اضافه می کند و یک پیام آنی در انتهای صفحه نمایش ظاهر می شود که نشان دهنده­ی URI مربوط به ContentProvider همراه با شماره رکورد اضافه شده به پایگاه داده است. این عملیات از متد insert() استفاده می کند. این کار را برای اضافه کردن تعدادی دانش آموز به پایگاه داده­ی تامین کننده محتوا تکرار کنید.

بعد از اینکه رکوردها را به پایگاه داده اضافه کردید، اکنون وقت آن است که از ContentProvider درخواست کنید که این رکوردها را به شما برگرداند. بر روی دکمه Retrieve Students کلیک کند، این کار تمام رکودهای موجود را واکشی کرده و آنها را یک به یک برای شما نمایش می دهد. این کار با توجه به آنچه که ما در متد query() پیاده سازی کردیم، انجام می شود.

شما می توانید به همان صورتی که ما عملیات add و read را پیاده سازی کردیم، با ایجاد توابع callback در فایل MainActivity.java ، فعالیت هایی را برای عملیات update و delete بنویسید و سپس واسط کاربری خود را برای ایجاد دکمه هایی برای عملیات update و delete تغییر دهید.

به این ترتیب شما می توانید از Content Provider موجود مانند یک دفترچه تلفن استفاده کنید و یا می توانید از مفهوم Content Provider برای توسعه اپلیکیشن های مبتنی بر پایگاه داده­ ی جالبی استفاده کنید. در این اپلیکیشن ها می توانید همان طور که در مثال بالا شرح داده شد، از همه نوع عملیات پایگاه داده مانند خواندن (read)، نوشتن (write)، به روز رسانی (update) و حذف (delete) استفاده کنید.