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

گاهی اوقات لازم است تا داده ها در بین اپلیکیشن ها به اشتراک گذاشته شوند. در این موارد ارائه دهنده محتوا بسیار مفید است.
ارائه دهندگان محتوا به شما اجازه می دهند تا محتوا را در یک مکان متمرکز کنید و اپلیکیشن های متفاوت بسیاری در صورت نیاز به آن دسترسی داشته باشند. ارائه دهنده محتوا بسیار شبیه به یک پایگاه داده رفتار می کند که می توانید جست و جو یا query تعریف کنید، محتوای آن را ویرایش کنید، و همچنین محتوایی را اضافه و یا حذف کنید. برای انجام کارهای فوق می توانید از متدهای insert()،upte()،elete()، و query() استفاده کنید. در اغلب موارد این داده ها در پایگاه داده SQLite ذخیره می شوند.

ارائه دهنده محتوا به عنوان یک زیر کلاس از کلاس ContentProvier پیاده سازی می شود و باید مطابق با مجموعه استاندارد های رابط های برنامه کاربردی (API) پیاده سازی شود تا ارائه دهنده محتوا بتواند با اپلیکیشن های دیگر تراکنش انجام دهد.

public clss My Appliction extens  ContentProvier 

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

<prefix>://<uthority>/<ttype>/<i>

در جدول زیر جزئیات بخش های مختلف URI آورده شده است:


Sr.No

Prt ∓ Description


۱

prefix

همیشه محتوا بعد از //: تنظیم می شود.
۲

Authority

این نام ارائه دهنده محتوا را مشخص می کند، برای مثال contctsbrowser و غیره. برای ارائه دهندگان محتوای سه بخشی، این قسمت یکی از نام های کامل خواهد بود. برای مثال

com.tutorilspoint.sttusprovier


۳

ttype

این قسمت نوع داده ای که این تامین کننده محتوای خاص فراهم می کند را مشخص می کند. برای مثال اگر شما محتوای کل مخاطبین را از تامین کننده محتوای آن بگیرید مسیر (pth) شما people و URI خواهد بود مشابه

thiscontent://contcts/people


۴

I

این قسمت رکورد خاص درخواست شده را مشخص می کند. برای مثال اگر بخواهید مخاطب شماره ۵ را از ارائه دهنده محتوای مخاطبین (Contcts ) جستو جو کنید URI بصورت زیر خواهد شد:

content://contcts/people/5.



ساختن ارائه دهنده محتوا
گام های ساده زیر مراحل ایجاد ارائه دهنده محتوا را نشان می دهد.

اول از همه شما نیاز به ایجاد یک کلاس ارائه دهنده محتوا که برگرفته از کلاس ContentProvierbseclss دارید.

در گام دوم، شما نیاز به تعریف آدرس URI ارائه دهنده محتوا خود دارید که برای دسترسی به محتوا استفاده می شود.

بعد شما نیاز به ایجاد پایگاه داده خود برای نگه داشتن محتوا دارید. معمولا، آندروید از پایگاه داده SQLite استفاده می کند و با توجه به اینکه SQLite ازمتدهای Open Helper برای ساختن یا باز کردن پایگاه داده ارائه دهنده استفاده می کند لازم است فریم ورک متد ()onCrete را مورد استفاده قرار دهد. هنگامی که نرم افزار شما راه اندازی می شود، متد ()onCrete تمام ارائه دهندگان محتوایی را کهدرنخ اصلی برنامه فراخوانی کرده اید کنترل و اجرا می کند.
در گام بعد شما باید برای اجرای عملیات خاص پایگاه داده ، کوئری های ارائه دهنده محتوا را پیاده سازی کنید.
در نهایت ارائه دهنده محتوای خود را در فایل فعالیت (ctivity) خود با استفاده از تگ < در اینجا لیستی از متدهایی که شما نیاز به اورراید آنها در کلاس ارائه دهنده محتوا دارید تا ارائه دهنده محتوای شما کار کند آورده شده است:

()onCrete : این متد زمانی که ارائه دهنده محتوا شروع بکار می کند فراخوانی می شود.

query() : این متد یک درخواست از کاربر دریافت می کند. و نتیجه را به عنوان یک شیء Cursor بر می گرداند.

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

elete() : این متد رکوردی از ارائه دهنده محتوا را حذف می کند.

upte() : این متد رکوردی از ارائه دهنده محتوا را به روز رسانی می کند.

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

مثال:
این مثال به شما توضیح می دهد که چگونه ContentProvier خود را ایجاد کنید. بنابراین اجازه دهد مراحل زیر همانند مثال ایجاد < href="http://www.evelopzoom.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D9%86%D8%AF%D8%B%D9%88%DB%8C%D8%AF-%D9%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC/">Hello Worl دنبال کنیم.


Step
Description
۱
شما باید از محیط اندروید استدیو استفاده کنید تا یک اپلیکیشن اندروید ایجاد کنید. یک  اپلیکیشن با نام My Appliction تحت بسته com.exmple.MyAppliction  با blnk Activity ایجاد کنید.
۲
فایل اکتیویتی اصلی MinActivity.jv اصلاح می کنیم تا دو متد onClickANme() و onClickRetrieveStuents() را اضافه کنیم.
۳
یک فایل جدید جاوا با نام StuentsProvier.jv تحت بسته com.exmple.MyAppliction تا فراهم کننده واقعی خودتان و متدهای مربوط به آن را تعریف کنید.
۴
content provier خودتان را در فایل AnroiMnifest.xml با استفاده از تگ <provier…/>  ثبت کنید.
۵
فایل res/lyout/ctivitymin.xml را ویرایش کنید و یک GUI  کوچک به آن برای افزودن رکورد دانش آموزان اضافه کنید.
۶
نیازی به ویرایش string.xml نیست. اندروید استدیو از آن محافظت می کند.
۷
اپلیکیشن را بر روی  lunch Anroi emultor اجرا کنید و نتیجه تغییرات انجام شده در اپلیکیشن خود را بررسی کنید.


در زیر محتوای تغییر یافته فایل فعالیت اصلی src / com.exmple.MyAppliction / MinActivity.jv است. این فایل می تواند هر یک از متد های اساسی چرخه حیات باشد. ما دو روش متد ()onClickANme و ()onClickRetrieveStuents برای تعامل کاربر با اپلیکیشن اضافه کرده ایم.

pckge com.exmple.MyAppliction;

import nroi.net.Uri;
import nroi.os.Bunle;
import nroi.pp.Activity;

import nroi.content.ContentVlues;
import nroi.content.CursorLoer;

import nroi.tbse.Cursor;

import nroi.view.Menu;
import nroi.view.View;

import nroi.wiget.EitText;
import nroi.wiget.Tost;

public clss MinActivity extens Activity 

   @Overrie
   protecte voi onCrete(Bunle sveInstnceStte) 
      super.onCrete(sveInstnceStte);
      setContentView(R.lyout.ctivitymin);
   
   public voi onClickANme(View view) 
      // A  new stuent recor
      ContentVlues vlues = new ContentVlues();
      vlues.put(StuentsProvier.NAME,
         ((EitText)finViewByI(R.i.eitText2)).getText().toString());

      vlues.put(StuentsProvier.GRADE,
         ((EitText)finViewByI(R.i.eitText3)).getText().toString());

      Uri uri = getContentResolver().insert(
         StuentsProvier.CONTENTURI, vlues);

      Tost.mkeText(getBseContext(),
         uri.toString(), Tost.LENGTHLONG).show();
   
   public voi onClickRetrieveStuents(View view) 
      // Retrieve stuent recors
      String URL = "content://com.exmple.MyAppliction.StuentsProvier";

      Uri stuents = Uri.prse(URL);
      Cursor c = mngeQuery(stuents, null, null, null, "nme");

      if (c.moveToFirst()) 
         o
            Tost.mkeText(this,
               c.getString(c.getColumnInex(StuentsProvier.ID)) +
                  ", " +  c.getString(c.getColumnInex( StuentsProvier.NAME)) +
                     ", " + c.getString(c.getColumnInex( StuentsProvier.GRADE)),
            Tost.LENGTHSHORT).show();
          while (c.moveToNext());
      
   

فایل جدید StuentsProvier.jv تحت بسته com.exmple.MyAppliction ایجاد کنید و محتوای src/com.exmple.MyAppliction/StuentsProvier.jv را دنبال کنید:

pckge com.exmple.MyAppliction;

import jv.util.HshMp;

import nroi.content.ContentProvier;
import nroi.content.ContentUris;
import nroi.content.ContentVlues;
import nroi.content.Context;
import nroi.content.UriMtcher;

import nroi.tbse.Cursor;
import nroi.tbse.SQLException;

import nroi.tbse.sqlite.SQLiteDtbse;
import nroi.tbse.sqlite.SQLiteOpenHelper;
import nroi.tbse.sqlite.SQLiteQueryBuiler;

import nroi.net.Uri;
import nroi.text.TextUtils;

public clss StuentsProvier extens ContentProvier 
   sttic finl String PROVIDERNAME = "com.exmple.MyAppliction.StuentsProvier";
   sttic finl String URL = "content://" + PROVIDERNAME + "/stuents";
   sttic finl Uri CONTENTURI = Uri.prse(URL);

   sttic finl String ID = "i";
   sttic finl String NAME = "nme";
   sttic finl String GRADE = "gre";

   privte sttic HshMp<String, String> STUDENTSPROJECTIONMAP;

   sttic finl int STUDENTS = ;
   sttic finl int STUDENTID = 2;

   sttic finl UriMtcher uriMtcher;
   sttic
      uriMtcher = new UriMtcher(UriMtcher.NOMATCH);
      uriMtcher.URI(PROVIDERNAME, "stuents", STUDENTS);
      uriMtcher.URI(PROVIDERNAME, "stuents/#", STUDENTID);
   

   /**
      * Dtbse specific constnt eclrtions
   */
   
   privte SQLiteDtbse b;
   sttic finl String DATABASENAME = "College";
   sttic finl String STUDENTSTABLENAME = "stuents";
   sttic finl int DATABASEVERSION = ;
   sttic finl String CREATEDBTABLE =
      " CREATE TABLE " + STUDENTSTABLENAME +
         " (i INTEGER PRIMARY KEY AUTOINCREMENT, " +
         " nme TEXT NOT NULL, " +
         " gre TEXT NOT NULL);";

   /**
      * Helper clss tht ctully cretes n mnges
      * the provier's unerlying t repository.
   */
   
   privte sttic clss DtbseHelper extens SQLiteOpenHelper 
      DtbseHelper(Context context)
         super(context, DATABASENAME, null, DATABASEVERSION);
      

      @Overrie
      public voi onCrete(SQLiteDtbse b) 
         b.execSQL(CREATEDBTABLE);
      

      @Overrie
      public voi onUpgre(SQLiteDtbse b, int olVersion, int newVersion) 
         b.execSQL("DROP TABLE IF EXISTS " +  STUDENTSTABLENAME);
         onCrete(b);
      
   

   @Overrie
   public boolen onCrete() 
      Context context = getContext();
      DtbseHelper bHelper = new DtbseHelper(context);

      /**
         * Crete  write ble tbse which will trigger its
         * cretion if it oesn't lrey exist.
      */
         
      b = bHelper.getWritbleDtbse();
      return (b == null)? flse:true;
   

   @Overrie
   public Uri insert(Uri uri, ContentVlues vlues) 
      /**
         * A  new stuent recor
      */
      long rowID = b.insert(	STUDENTSTABLENAME, "", vlues);

      /**
         * If recor is e successfully
      */
      if (rowID > 0) 
         Uri uri = ContentUris.withAppeneI(CONTENTURI, rowID);
         getContext().getContentResolver().notifyChnge(uri, null);
         return uri;
      
        
      throw new SQLException("File to   recor into " + uri);
   

   @Overrie
   public Cursor query(Uri uri, String projection, 
      String selection,String selectionArgs, String sortOrer) 

   @Overrie
   public int elete(Uri uri, String selection, String selectionArgs) 
      int count = 0;
      switch (uriMtcher.mtch(uri))
         cse STUDENTS:
            count = b.elete(STUDENTSTABLENAME, selection, selectionArgs);
         brek;

         cse STUDENTID:
            String i = uri.getPthSegments().get();
            count = b.elete( STUDENTSTABLENAME, ID +  " = " + i +
               (!TextUtils.isEmpty(selection) ? " 
               AND (" + selection + ')' : ""), selectionArgs);
            brek;
         efult:
            throw new IlleglArgumentException("Unknown URI " + uri);
      

      getContext().getContentResolver().notifyChnge(uri, null);
      return count;
   

   @Overrie
   public int upte(Uri uri, ContentVlues vlues, 
      String selection, String selectionArgs) 
      int count = 0;
      switch (uriMtcher.mtch(uri)) 
         cse STUDENTS:
            count = b.upte(STUDENTSTABLENAME, vlues, selection, selectionArgs);
         brek;

         cse STUDENTID:
            count = b.upte(STUDENTSTABLENAME, vlues, 
               ID + " = " + uri.getPthSegments().get() +
               (!TextUtils.isEmpty(selection) ? " 
               AND (" +selection + ')' : ""), selectionArgs);
            brek;
         efult:
            throw new IlleglArgumentException("Unknown URI " + uri );
      
        
      getContext().getContentResolver().notifyChnge(uri, null);
      return count;
   

   @Overrie
   public String getType(Uri uri) 
      switch (uriMtcher.mtch(uri))
         /**
            * Get ll stuent recors
         */
         cse STUDENTS:
            return "vn.nroi.cursor.ir/vn.exmple.stuents";
         /**
            * Get  prticulr stuent
         */
         cse STUDENTID:
            return "vn.nroi.cursor.item/vn.exmple.stuents";
         efult:
            throw new IlleglArgumentException("Unsupporte URI: " + uri);
      
   

در زیر محتوای اصلاح شده فایل AnroiMnifest.xml آورده شده است. در اینجا تگ برای معرفی ارائه دهنده محتوا ما، اضافه شده است.

<?xml version=".0" encoing="utf-8"?>
<mnifest xmlns:nroi="http://schems.nroi.com/pk/res/nroi" pckge="com.exmple.MyAppliction">

   <ppliction nroi:llowBckup="true" nroi:icon="@mipmp/icluncher" nroi:lbel="@string/ppnme" nroi:supportsRtl="true" nroi:theme="@style/AppTheme">
         <ctivity nroi:nme=".MinActivity">
            <intent-filter>
               <ction nroi:nme="nroi.intent.ction.MAIN" />
               <ctegory nroi:nme="nroi.intent.ctegory.LAUNCHER" />
            </intent-filter>
         </ctivity>
        
      <provier nroi:nme="StuentsProvier" nroi:uthorities="com.exmple.MyAppliction.StuentsProvier"/>
   </ppliction>
</mnifest>

در ادامه محتوای فایل RES / lyout / ctivitymin.xml آورده شده است:

<?xml version=".0" encoing="utf-8"?>
<ReltiveLyout xmlns:nroi="http://schems.nroi.com/pk/res/nroi" xmlns:tools="http://schems.nroi.com/tools" nroi:lyoutwith="mtchprent" nroi:lyoutheight="mtchprent" nroi:pingBottom="@imen/ctivityverticlmrgin" nroi:pingLeft="@imen/ctivityhorizontlmrgin" nroi:pingRight="@imen/ctivityhorizontlmrgin" nroi:pingTop="@imen/ctivityverticlmrgin" tools:context="com.exmple.MyAppliction.MinActivity">

   <TextView nroi:i="@+i/textView" nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:text="Content provier" nroi:lyoutlignPrentTop="true" nroi:lyoutcenterHorizontl="true" nroi:textSize="30p" />

   <TextView nroi:i="@+i/textView2" nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:text="Tutorils point " nroi:textColor="#ff87ff09" nroi:textSize="30p" nroi:lyoutbelow="@+i/textView" nroi:lyoutcenterHorizontl="true" />

   <ImgeButton nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:i="@+i/imgeButton" nroi:src="@rwble/bc" nroi:lyoutbelow="@+i/textView2" nroi:lyoutcenterHorizontl="true" />

   <Button nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:i="@+i/button2" nroi:text="A Nme" nroi:lyoutbelow="@+i/eitText3" nroi:lyoutlignRight="@+i/textView2" nroi:lyoutlignEn="@+i/textView2" nroi:lyoutlignLeft="@+i/textView2" nroi:lyoutlignStrt="@+i/textView2" nroi:onClick="onClickANme"/>

   <EitText nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:i="@+i/eitText" nroi:lyoutbelow="@+i/imgeButton" nroi:lyoutlignRight="@+i/imgeButton" nroi:lyoutlignEn="@+i/imgeButton" />

   <EitText nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:i="@+i/eitText2" nroi:lyoutlignTop="@+i/eitText" nroi:lyoutlignLeft="@+i/textView" nroi:lyoutlignStrt="@+i/textView" nroi:lyoutlignRight="@+i/textView" nroi:lyoutlignEn="@+i/textView" nroi:hint="Nme" nroi:textColorHint="@nroi:color/holobluelight" />

   <EitText nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:i="@+i/eitText3" nroi:lyoutbelow="@+i/eitText" nroi:lyoutlignLeft="@+i/eitText2" nroi:lyoutlignStrt="@+i/eitText2" nroi:lyoutlignRight="@+i/eitText2" nroi:lyoutlignEn="@+i/eitText2" nroi:hint="Gre" nroi:textColorHint="@nroi:color/holobluebright" />

   <Button nroi:lyoutwith="wrpcontent" nroi:lyoutheight="wrpcontent" nroi:text="Retrive stuent" nroi:i="@+i/button" nroi:lyoutbelow="@+i/button2" nroi:lyoutlignRight="@+i/eitText3" nroi:lyoutlignEn="@+i/eitText3" nroi:lyoutlignLeft="@+i/button2" nroi:lyoutlignStrt="@+i/button2" nroi:onClick="onClickRetrieveStuents"/>
</ReltiveLyout>

مطمئن شوید محتوای فایل res/vlues/strings.xml بصورت زیر است:

<?xml version=".0" encoing="utf-8"?>
<resources>
    <string nme="ppnme">My Appliction</string>
</resources>;

بیایید اپلیکیشن ایجاد شده را اجرا کنیم تا نتیجه را ببینیم. من فرض می کنم شما AVD خود را در هنگام نصب و راه اندازی محیط برنامه نویسی ایجاد کرده اید. برای اجرای برنامه از Anroi Stuio IDE، یکی از فایل های فعالیت پروژه را باز کرده و بر روی آیکون Run در نوار ابزار کلیک کنید. اندروید استودیو برنامه را روی AVD شما نصب و آن را شروع می کند و اگر همه چیز با تنظیمات و اپلیکیشن شما خوب بود، آن پنجره شبیه ساز زیر را نمایش می دهد، لازم است صبر کنید چون ممکن بر اساس سرعت کامپیوتر شما کمی طول بکشد:

حالا بیایید نام دانش آموز و نمره او را وارد کنیم و در نهایت بر روی دکمه A کلیک کنیم. این کار رکورد دانش آموز را به پایگاه داده اضافه خواهد کرد و سریع یک پیام در پایین URI ارائه دهنده محتوا همراه با شماره رکورد اضافه شده در پایگاه داده نمایش خواهد داد. این عملیات از متد insert() ما استفاده می کند. اجازه دهید این روند عملیات را چند بار تکرار کنیم تا چند دانش آموز دیگر را در پایگاه داده ارائه دهنده محتوا اضافه کنیم.

حالا شما توانسته اید فیلد های جدید اضافه کنید ، بیایید از Content Provier بخواهیم که نتیجه ها را به ما برگرداند ، پس روی دکمه ی Retrive stuent در برنامه کلیک کنید نتیجه های موجود در پایگاه داده یک به یک به شما نمایش داده خواهند شد در اینجاست که باید به اهمیت متد query() پی ببرید
همان گونه که ما اکتیویتی های افزودن و بازیابی رکورد را پیاده سازی کردیم، شما نیز می توانید اکتیویتی های حذف و به روز رسانی رکورد را پیاده سازی کنید.
همچنین شما با همین روش می توانید از ارائه دهنده های موجود محتوا، مانند Aress Book استفاده کنید یا با به کار گیری مفاهیم ارائه دهنده ی محتوا یک پایگاه داده مطلوب بسازید و با استفاده از تمام عملیات های قابل اجرا روی یک پایگاه داده مانند خواندن و نوشتن، یک نرم افزار پویا ایجاد کنید.

< href="http://www.evelopzoom.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D9%86%D8%AF%D8%B%D9%88%DB%8C%D8%AF-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%87%D9%85/">منبع