2 سال پیش / خواندن دقیقه

آموزش تامین کنندگان محتوا (Content Providers) در اندروید

آموزش تامین کنندگان محتوا (Content Providers) در اندروید

یک مؤلفه تامین کننده محتوا در صورت درخواست، داده ها را از یک برنامه به دیگر برنامه ها ارائه می دهد. این درخواست ها با متد های کلاس ContentResolver انجام می شود. تامین کننده محتوا می تواند از متد های مختلفی برای ذخیره داده های خود استفاده کند و داده ها را می توان در پایگاه داده ، فایل ها یا حتی روی شبکه ذخیره کرد.

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

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

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

public class My Application extends ContentProvider {

}

URI های محتوا

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

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

در اینجا جزئیات بخش های مختلف 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 دارید که ContentProviderbaseclass را گسترش می دهد.
  • دوم ، باید آدرس URI تامین کننده محتوای خود را که برای دسترسی به محتوا استفاده خواهد شد ، تعریف کنید.
  • در مرحله بعد برای حفظ محتوا باید پایگاه داده خود را ایجاد کنید. اندروید معمولاً از پایگاه داده SQLite استفاده می کند و چارچوب باید از متد onCreate() استفاده کند که از متد SQLite Open Helper برای ایجاد یا باز کردن پایگاه داده تامین کننده محتوا استفاده می کند. هنگامی که برنامه راه اندازی شد، کنترل کننده onCreate() هر یک از تامین کنندگان محتوای خود را در نخ برنامه اصلی فراخوانی می کند.
  • در مرحله بعد برای انجام عملیات مختلف پایگاه داده ها، باید پرس و جوهای Content Provider را پیاده سازی کنید.
  • سرانجام با استفاده از تگ <provider> Content Provider را در فایل فعالیت خود ثبت کنید.

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

آموزش تامین کنندگان محتوا (Content Providers) در اندروید

  • onCreate() این متد زمانی که تامین کننده شروع به کار می کند، فراخوانی می شود.
  • query() این متد یک درخواست از client دریافت می کند. نتیجه به صورت یک شی cursor برگردانده می شود.
  • Insert() این متد یک رکورد جدید را در تامین کننده محتوا درج می کند.
  • Delete() این متد یک رکورد موجود را از تامین کننده محتوا حذف می کند.
  • Update() این متد رکورد موجود را از تامین کننده محتوا به روزرسانی می کند.
  • getType() این متد نوع MIME داده را در URI داده شده باز می گرداند.

مثال

این مثال چگونگی ایجاد ContentProvider را توضیح می دهد. بنابراین بیایید مراحل زیر را شبیه به مواردی که هنگام ایجاد مثال Hello World − دنبال کردیم ، دنبال کنیم:

مرحله توضیحات
۱ شما می توانید از Android StudioIDE برای ایجاد یک برنامه اندروید استفاده کنید، با نام My Application تحت پکیج com.example.MyApplication و با activity خالی.
۲ فایل فعالیت اصلی MainActivity.java را تغییر دهید تا دو متد جدید ClickAddName() و onClickRetrieveStudents() را اضافه کنید.
۳ یک فایل جاوا جدید به نام StudentProvider.java را تحت پکیج com.example.MyApplication ایجاد کرده تا تامین کننده واقعی و متد های مرتبط خود را تعریف کنید.
۴ با استفاده از تگ <provider…/>، تامین کننده محتوای خود را در فایل AndroidManifest.xml ثبت کنید
۵ محتوای پیش فرض فایل res / layout / activity_main.xml را تغییر دهید تا یک رابط کاربری گرافیکی کوچک برای اضافه کردن رکورد های مربوط به دانش آموزان درج کنید.
۶ نیاز به تغییر string.xml.Android نیست. استودیو اندروید از فایل string.xml مراقبت می کند.
۷ برنامه را اجرا کنید تا شبیه ساز اندروید راه اندازی شود و نتیجه تغییرات انجام شده در برنامه را مشاهده کنید.

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

package com.example.MyApplication;

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);

}

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.MyApplication.StudentsProvider”;

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());

}

}

}

فایل جدید StudentProvider.java را تحت پکیج com.example.MyApplication ایجاد کنید. در زیر محتوای src / com.example.MyApplication / StudentProvider.java آورده شده است-

package com.example.MyApplication;

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.MyApplication.StudentsProvider”;

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:

}

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…/>را اضافه کرده ایم تا تامین کننده محتوای ما را شامل شود:

<?xml version=”1.0″ encoding=”utf-8″?>

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”

package=”com.example.MyApplication”>

<application

android:allowBackup=”true”

android:icon=”@mipmap/ic_launcher”

android:label=”@string/app_name”

android:supportsRtl=”true”

android:theme=”@style/AppTheme”>

<activity android:name=”.MainActivity”>

<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.MyApplication.StudentsProvider”/>

</application>

</manifest>

در زیر محتوای فایل res / layout / activity_main.xml آورده شده است_

<?xml version=”1.0″ encoding=”utf-8″?>

<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:paddingBottom=”@dimen/activity_vertical_margin”

android:paddingLeft=”@dimen/activity_horizontal_margin”

android:paddingRight=”@dimen/activity_horizontal_margin”

android:paddingTop=”@dimen/activity_vertical_margin”

tools:context=”com.example.MyApplication.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>

</resources>;

اکنون برنامه را اجرا می کنیم. فرض می کنیم هنگام انجام تنظیمات محیطی ، AVD خود را ایجاد کرده اید. برای اجرای برنامه از Android Studio IDE ، یکی از پرونده های activity پروژه خود را باز کرده و از نوار ابزار ، روی نماد Run Android StudioRun Icon کلیک کنید. Android Studio برنامه را در AVD شما نصب می کند و آن را راه اندازی می کند. اگر همه چیز درست باشد ، پنجره Emulator زیر نمایش داده می شود، اگر طول کشید کمی صبر کنید-

آموزش تامین کنندگان محتوا (Content Providers) در اندروید

حال بیایید Name student و Grade را پر کنید و در آخر بر روی دکمه Add Name کلیک کنید ، این کار باعث می شود رکورد دانشجو در پایگاه داده اضافه شود و یک پیام در پایین نمایش داده می شود که ContentProvider URI را به همراه شماره رکورد اضافه شده در پایگاه داده اضافه می کند. این عمل از متد ()insert استفاده می کند. فرآیند را برای افزودن دانشجویان دیگری به پایگاه داده تامین کننده محتوا تکرار کنید.

آموزش تامین کنندگان محتوا (Content Providers) در اندروید

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

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

به این ترتیب می توانید از content provider موجود مانند Content Book استفاده کنید یا می توانید از مفهوم content provider در توسعه برنامه های کاربردی مبتنی بر پایگاه داده استفاده کنید. می توانید انواع عملکردهای پایگاه داده مانند خواندن ، نوشتن ، به روزرسانی و حذف را همانطور که در مثال توضیح داده شد ، استفاده کنید.


شاید از نوشته‌های زیر خوشتان بیاید
نظر خود را درباره این پست بنویسید ...

منوی سریع