ارائه دهنده محتوا در برنامه نویسی اندروید

4 سال پیش
رائه دهنده محتوا در برنامه نویسی اندروید

ارائه دهنده محتوا در برنامه نویسی اندروید

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

 

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

 

 

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

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

public class My Application extends  ContentProvider {
}

 

URI های محتوا

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

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

در اینجا جزئیات قسمت های مختلف URI وجود دارد:

۱-prefix

این همیشه :// روی محتوا تنظیم می شود

۲-authority

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

۳-data_type

این نشان دهنده نوع داده ای است که این ارائه دهنده خاص ارائه می دهد. به عنوان مثال، اگر تمام مخاطبین را از ارائه دهنده محتوای مخاطب دریافت می کنید، مسیر داده افراد خواهد بود و URI به این شکل است: // contact / people

۴-id

رکورد خاص درخواستی را مشخص می کند. به عنوان مثال ، اگر به دنبال مخاطب شماره ۵ در ارائه دهنده محتوای مخاطب هستید ، URI ،مانند این محتوا که اینگونه به نظر می رسد: // contact / people / 5.

 

ایجاد ارائه دهنده محتوا در اندروید

این شامل چندین مرحله ساده برای ایجاد ارائه دهنده محتوای  است.

  1. اول از همه شما باید یک کلاس Content Provider بسازید که ContentProviderbaseclass را گسترش دهد.
  2. دوم، شما باید آدرس URI ارائه دهنده محتوای خود را تعریف کنید که برای دسترسی به محتوا استفاده می شود.
  3. در مرحله بعدی شما باید پایگاه داده خود را برای نگهداری محتوا ایجاد کنید. معمولاً اندروید از پایگاه داده SQLite و چارچوب استفاده می کند و باید از روش ()onCreate  استفاده کند که از روش SQLite Open Helper برای ایجاد یا باز کردن پایگاه داده ارائه دهنده استفاده می کند. هنگامی که برنامه شما راه اندازی می شود، کنترل کننده ()onCreate  هر یک از ارائه دهندگان محتوای آن در بخش اصلی برنامه فراخوانی می شود.
  4. در مرحله بعدی شما باید برای انجام عملیات خاص مختلف پایگاه داده، پرس و جوهای ارائه دهنده محتوا را پیاده سازی کنید.
  5. در آخر با استفاده از برچسب <provider> ارائه دهنده محتوای خود را در پرونده فعالیت خود ثبت کنید.

 

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

 

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

 

مثال

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

مراحل توضیحات
۱ شما از Android Studio IDE برای ایجاد یک برنامه اندروید استفاده می کنید و نام آن را به عنوان  My Application تحت یک بسته com.example.MyApplication، با  فعالیت خالی کرد
۲ پرونده فعالیت اصلی MainActivity.java را اصلاح کنید تا دو روش جدید در  ()ClickAddName و ()onClickRetrieveStudents  اضافه کنید.
۳ برای تعریف ارائه دهنده واقعی و روش های مرتبط، یک فایل جاوا جدید به نام StudentProvider.java در بسته com.example.MyApplication ایجاد کنید
۴ با استفاده از برچسب <provider…/> ارائه دهنده محتوای خود را در پرونده AndroidManifest.xml خود ثبت کنید
۵ محتوای پیش فرض فایل res / layout / activity_main.xml را تغییر دهید تا شامل یک رابط کاربری گرافیکی کوچک برای افزودن سوابق دانشجویان باشد.
۶ نیازی به تغییر string.xml نیست. Android studio از پرونده 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، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی Android StudioRun Icon کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.

 

 

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

 

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

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

منبع.

لیست جلسات قبل آموزش برنامه نویسی اندروید

  1. نگاهی کلی به برنامه نویسی اندروید
  2. تنظیمات محیط  در برنامه نویسی اندروید
  3. معماری برنامه نویسی اندروید
  4. اجزای برنامه در برنامه نویسی اندروید
  5. Hello World در برنامه نویسی اندروید
  6. سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
  7. فعالیت در برنامه نویسی اندروید
  8. سرویس در برنامه نویسی اندروید
  9. گیرنده های پخش در برنامه نویسی اندروید
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه