no-img
سامنتا

Content Providers در اندروید( تامین کننده ی محتوا )


سامنتا
دانلودهای ویژه
اطلاعیه های سایت

ادامه مطلب

Content Providers در اندروید( تامین کننده ی محتوا )
zip
اردیبهشت ۳۱, ۱۳۹۵

Content Providers در اندروید( تامین کننده ی محتوا )


Content Provider یا تامین کننده ی محتوا ، داده ها را از یک برنامه ی اندرویدی به اشتراک میگذارد تا برنامه های دیگر از آن استفاده کنند . مثلا برنامه ای که نیاز به تصویر دارد میتواند از Content provider مربوط به گالری جهت نمایش و گزینش تصویر مورد نظر از درون فایل های تصویری اندروید را دارد

فایل ویدیویی این آموزش بصورت فارسی و با کیفیت بالا قرار داده شد لطفا از لینک زیر دریافت فرمائید 

۲,۵۰۰ تومان – خرید Loading

 

 

content provider اندروید

content provider اندروید

گاهی اوقات نیاز هست که اطلاعات و داده ها بین برنامه ها به اشتراک گذاشته شود . اینجاست که اهمیت content provider ها مشخص میشود .

Content Provider ها یا تامین کننده ی محتواها در اندروید ، به شما این اجازه را میدهند که اطلاعات و داده های خود را در نقطه ی متمرکزی با دیگر برنامه هایی که به این اطلاعات نیاز دارند ، به اشتراک بگذارد .

تامین کننده ی محتوا بیشتر شبیه به پایگاه داده Sql هست که شما میتوانید روی آن کوئری خاصی داشته باشید ، محتویات آنرا ویرایش کنید ، همانطور که میدانید محتویات آنرا پاک کنید یا به آن اضافه کنید همه ی این کارها را با متد  insert(), update(), delete(), و query() میتوانید در Sql انجام دهید .

در بیشتر موارد این اطلاعات در پایگاه داده ی Sqlite ذخیره میشوند.

یک تامین کننده ی محتوا یا Content Provider از کلاس اصلی ContentProvider  ارث بری میکند و برای پیاده سازی آن باید از API های استاندارد استفاده کرد تا دیگر برنامه ها بتوانند به درستی به محتویات آن دسترسی داشته باشند 

public class My Application extends ContentProvider {
}

URL های محتوا در Content Provider :

برای کوئری گرفتن از یک تامین کننده ی محتوا ، رشته ی کوئری را به صورت رشته ی URL زیر مشخص کنید : 

<prefix>://<authority>/<data_type>/<id>

 

در جدول زیر جزئیات کامل URL آمده است  :

قسمتتوضیحات
prefixهمیشه باید این عبارت در ابتدا به کار برده شود و سپس محتوا بعد از :// قرار بگیرد
authorityنام content provider اینجا قرار میگیرد ، برای مثال Content ، browser و ….
برای content provider های سه بخشی ، این قسمت یکی از نام های واجد شرایط خواهد بود 
برای نمونه content provider با نام ir.samenta.statusprovider
data_typeاین عبارت نوع داده ای که تامین کننده ی محتوا فراهم میکند را مشخص میکند ، برای مثال اگر شما محتوای کل مخاطبین را از تامین کننده ی محتوای آن بگیرید path شما مخاطبین و URL مشابه content://contacts/people خواهد بود 
idآیدی محتوا برای دسترسی به آنها را مشخص میکند برای مثال اگر بخواهید به مخاطب شماره ی ۵ دسترسی داشته باشید باید اینگونه بنویسید : content://contacts/people/5

 

ساخت تامین کننده ی محتوا ( Content Provider ) در اندروید 

گام های زیر راه های ساده ای هستند برای ساختن یک تامین کننده ی محتوا ( Content Provider ) :

  • اولین گام ساختن یک کلاس هست که از ContentProviderbaseclass ارث بری کند
  • دومین گام تعریف URI تامین کننده محتوا هستید که برای دسترسی به محتوا استفاده خواهد شد . 
  • مرحله بعدی ساخت پایگاه داده ی اختصاصی برای نگهداری محتوا میباشد ، بطور معمول اندروید از Sqlite برای دیتابیس و نگهداری اطالاعات استفاده میکند .  شما باید ازمتد های SQLite Open Helper برای پایگاه داده استفاده کنید زمانی که برنامه اجرا میشود ، کنترل کننده ی هر Content Provider که در متد onCreate() میباشد در ترد اصلی برنامه شروع به فعالیت میکنند 
  • در قدم بعدی شما بایستی  ، جهت انجام عملیات خاص پایگاه داده  ، کوئری های Content Provider را implement  کنید.
  • در نهایت شما باید Content Provider را با استفاده از تگ <provider> در اکتیویتی برنامه معرفی کنید

در اینجا متدهایی که باید از کلاس Content Provider ، اورراید (override ) بکنید :

content provider در اندروید

content provider در اندروید

 

  • onCreate()  زمانی که Content provider شروع به کار میکند این متد اجرا میشود .
  • query() این متد درخواستی را از طرف کلاینت دریافت میکند و نتیجه را بصورت شی Cursor برمیگرداند . 
  • insert() این متد رکورد جدیدی را به content provider اضافه میکند 
  • delete() این متد رکوردی را از content provider پاک میکند 
  • update() رکورد موجودی را بروزرسانی میکند 
  • getType() این متد نوع MIME داده ها را که بوسیله ی URI ارسال شده را برمیگرداند . 

مثال برای ساخت Content Provider در اندروید 

این مثال به شما نشان میدهد که چگونه ContentProvider اختصاصی خودتان را درست کنید . بنابراین بیایید قدم های زیر را همانند مثال Hello World  دنبال کنیم :

 

قدمتوضیحات
۱شما باید از محیط اندروید استودیو استفاده کنید و پروژه ی جدیدی با نام My Application بسازید که نام بسته ی آن com.example.My Application باشد 
۲کلاس MainActivity.java را باز کنید و دو متد جدیدی به آن اضافه کنید نام متد ها onClickAddName() و onClickRetrieveStudents() 
۳درون پکیج موجود برنامه که اکتیویتی اصلی برنامه در ان هست کلاس جاوایی جدیدی بسازید و نام انرا  StudentsProvider.java  بزارید تا Content Provider وافعی را ایجاد کنید 
۴

مانیفست پروژه ی خود را باز کنید و Content provider خودتان را با استفاده از تگ <provider…/> تعریف کنید 

۵فایل res/layout/activity_main.xml را وایرایش کنید و یک ویو ساده اضافه کنید که بتوانید نتیجه را درون آن نمایش دهید 
۶فایل string.xml را ویرایش نکنید و نیازی به ویرایش آن نیست
۷برنامه را روی ماشین مجازی اجرا کنید و منتظر نمایش نتیجه روی اندروید مجازی خود باشید

در زیر محتویات فایل MainActivity که ویرایش کردید هست آدرس فایل src/com.example.My Application/MainActivity.java بود

این فایل میتواند شامل تمام متدهای اساسی چرخه ی حیات باشد  ما دو متدی که در جدول بالا ذکر کردیم را به آن اضافه کردیم :

package com.example.My Application;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } public void onClickAddName(View view) { // Add a new student record ContentValues values = new ContentValues(); values.put(StudentsProvider.NAME, ((EditText)findViewById(R.id.editText2)).getText().toString()); values.put(StudentsProvider.GRADE, ((EditText)findViewById(R.id.editText3)).getText().toString()); Uri uri = getContentResolver().insert( StudentsProvider.CONTENT_URI, values); Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show(); } public void onClickRetrieveStudents(View view) { // Retrieve student records String URL = "content://com.example.provider.College/students"; Uri students = Uri.parse(URL); Cursor c = managedQuery(students, null, null, null, "name"); if (c.moveToFirst()) { do{ Toast.makeText(this, c.getString(c.getColumnIndex(StudentsProvider._ID)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) + ", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)), Toast.LENGTH_SHORT).show(); } while (c.moveToNext()); } }
}

در مثال باالا گفته بودیم که فایل جاوایی جدیدی درست کنید با نام StudentsProvider.java که در آدرس src/com.example.My Application/StudentsProvider.java قرار میگیرد محتویات آن فایل باید به شکل زیر باشد : 

package com.example.My Application;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class StudentsProvider extends ContentProvider { static final String PROVIDER_NAME = "com.example.provider.College"; static final String URL = "content://" + PROVIDER_NAME + "/students"; static final Uri CONTENT_URI = Uri.parse(URL); static final String _ID = "_id"; static final String NAME = "name"; static final String GRADE = "grade"; private static HashMap<String, String> STUDENTS_PROJECTION_MAP; static final int STUDENTS = 1; static final int STUDENT_ID = 2; static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS); uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID); } /** * Database specific constant declarations */ private SQLiteDatabase db; static final String DATABASE_NAME = "College"; static final String STUDENTS_TABLE_NAME = "students"; static final int DATABASE_VERSION = 1; static final String CREATE_DB_TABLE = " CREATE TABLE " + STUDENTS_TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL, " + " grade TEXT NOT NULL);"; /** * Helper class that actually creates and manages * the provider's underlying data repository. */ private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context){ super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_DB_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME); onCreate(db); } } @Override public boolean onCreate() { Context context = getContext(); DatabaseHelper dbHelper = new DatabaseHelper(context); /** * Create a write able database which will trigger its * creation if it doesn't already exist. */ db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { /** * Add a new student record */ long rowID = db.insert(	STUDENTS_TABLE_NAME, "", values); /** * If record is added successfully */ if (rowID > 0) { Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); getContext().getContentResolver().notifyChange(_uri, null); return _uri; } throw new SQLException("Failed to add a record into " + uri); } @Override public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) { SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(STUDENTS_TABLE_NAME); switch (uriMatcher.match(uri)) { case STUDENTS: qb.setProjectionMap(STUDENTS_PROJECTION_MAP); break; case STUDENT_ID: qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1)); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } if (sortOrder == null || sortOrder == ""){ /** * By default sort on student names */ sortOrder = NAME; } Cursor c = qb.query(db,	projection,	selection, selectionArgs,null, null, sortOrder); /** * register to watch a content URI for changes */ c.setNotificationUri(getContext().getContentResolver(), uri); return c; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs); break; case STUDENT_ID: String id = uri.getPathSegments().get(1); count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int count = 0; switch (uriMatcher.match(uri)){ case STUDENTS: count = db.update(STUDENTS_TABLE_NAME, values, selection, selectionArgs); break; case STUDENT_ID: count = db.update(STUDENTS_TABLE_NAME, values, _ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" +selection + ')' : ""), selectionArgs); break; default: throw new IllegalArgumentException("Unknown URI " + uri ); } getContext().getContentResolver().notifyChange(uri, null); return count; } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)){ /** * Get all student records */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * Get a particular student */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } }
}

و همچنین محتویات ویرایش شده ی مانیفست AndroidManifest.xml برنامه نیز باید به شکل زیر باشد که توسط تگ <provider…/> تامین کننده ی محتوا (Content Provider ) به برنامه معرفی شده است : 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.My Application" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.My Application.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="StudentsProvider" <android:authorities="com.example.provider.College"> </provider> </application>
</manifest>

و محتویات فایل res/layout/activity_main.xml  که قرار بود ویرایش کنیم باید بصورت زیر باشد که یک دکمه به آن اضافه کردیم :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"/"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Content provider" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:textSize="30dp" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Tutorials point " android:textColor="#ff87ff09" android:textSize="30dp" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" /> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/imageButton" android:src="@drawable/abc" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/button2" android:text="Add Name" android:layout_below="@+id/editText3" android:layout_alignRight="@+id/textView2" android:layout_alignEnd="@+id/textView2" android:layout_alignLeft="@+id/textView2" android:layout_alignStart="@+id/textView2" android:onClick="onClickAddName"/> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText" android:layout_below="@+id/imageButton" android:layout_alignRight="@+id/imageButton" android:layout_alignEnd="@+id/imageButton" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText2" android:layout_alignTop="@+id/editText" android:layout_alignLeft="@+id/textView1" android:layout_alignStart="@+id/textView1" android:layout_alignRight="@+id/textView1" android:layout_alignEnd="@+id/textView1" android:hint="Name" android:textColorHint="@android:color/holo_blue_light" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/editText3" android:layout_below="@+id/editText" android:layout_alignLeft="@+id/editText2" android:layout_alignStart="@+id/editText2" android:layout_alignRight="@+id/editText2" android:layout_alignEnd="@+id/editText2" android:hint="Grade" android:textColorHint="@android:color/holo_blue_bright" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Retrive student" android:id="@+id/button" android:layout_below="@+id/button2" android:layout_alignRight="@+id/editText3" android:layout_alignEnd="@+id/editText3" android:layout_alignLeft="@+id/button2" android:layout_alignStart="@+id/button2" android:onClick="onClickRetrieveStudents"/>
</RelativeLayout>

 

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

<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">My Application</string> <string name="action_settings">Settings</string>
</resources>;

بیایید برنامه را اجرا و نتیجه را مشاهده کنیم . 

بعد از اجرای برنامه در روی ماشین مجازی باید نتیجه را به شکل زیر مشاهده کنید : 

تامین کننده ی محتوا اندروید 1

تامین کننده ی محتوا اندروید ۱

 

حالا دو فیلد خالی را پر کنید و روی دکمه ی ADD NAME کلیک کنید ، با این کار یک فید Student به پایگاه داده اضافه خواهد شد و یک پیام سریع مبنی بر ثبت نمایش داده خواهد شد که URI تامین کننده ی محتو را نیز برای شما نمایش خواهد داد اینجاست که شما اهمیت متد insert() را خواهید دانست . این عمل را چندیدن بار تکرار کنید و چند فیلد جدید Student اضافه کنید . 

 

تامین کننده ی محتوا در اندروید 2

تامین کننده ی محتوا در اندروید ۲

 

حالا شما توانسته اید فیلد های جدید اضافه کنید ، بیایید از Content Provider بخواهیم که نتیجه ها را به ما برگرداند ، پس روی دکمه ی Retrive student در برنامه کلیک کنید نتیجه های موجود در پایگاه داده یک به یک به شما نمایش داده خواهند شد در اینجاست که باید به اهمیت متد query()  پی ببرید 

شما به همین حالت میتوانید درون اکتیویتی خود برای متدهای حذف و بروزرسانی (delete and update) نیز کدنویسی کنید تا داده ها آپدیت شوند یا کلا پاک شوند 

در صورت داشتن هر گونه سوال میتوانید در قسمت نظرات بپرسید 

 



درباره نویسنده

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

تیم آموزشی سامنتا 70 نوشته در سامنتا دارد . مشاهده تمام نوشته های

دیدگاه ها


2 پاسخ به “Content Providers در اندروید( تامین کننده ی محتوا )”

  1. اماتور گفت:

    باسلام و تشکر از سایت خوبتون .

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

    اگه میشه جواب روبرام ایمیل کنید.

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

    لطفا بهم  کمک کنید.

پاسخ دهید

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