ارائه دهنده محتوا در برنامه نویسی اندروید
ارائه دهنده محتوا در برنامه نویسی اندروید
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، در مورد ارائه دهنده محتوا در برنامه نویسی اندروید صحبت خواهیم کرد.
یک جز ارائه دهنده محتوا، داده ها را از یک برنامه به برنامه دیگر در صورت درخواست ارائه می دهد. چنین درخواست هایی با استفاده از متدهای کلاس ContentResolver انجام می شود. یک ارائه دهنده محتوا در برنامه نویسی اندروید می تواند از روش های مختلفی برای ذخیره داده های خود استفاده کند و داده ها را می توان در یک پایگاه داده، در پرونده ها یا حتی از طریق شبکه ذخیره کرد.
گاهی اوقات لازم است داده ها را بین برنامه ها به اشتراک بگذارید اینجاست که ارائه دهندگان محتوا بسیار مفید می شوند.
ارائه دهندگان محتوا به شما امکان می دهند محتوا را در یک مکان متمرکز کنید و بسیاری از برنامه های مختلف در صورت لزوم به آن دسترسی دارند. یک ارائه دهنده محتوا بسیار شبیه یک پایگاه داده است که در آن می توانید در آن پرس و جو کنید، محتوای آن را ویرایش کنید و همچنین با استفاده از روش ()insert () update () delete () و query محتوا را اضافه یا حذف کنید. در بیشتر موارد این داده ها در یک پایگاه داده SQlite ذخیره می شوند.
یک ارائه دهنده محتوا به عنوان یک زیر کلاس از کلاس ContentProvider پیاده سازی می شود و باید یک مجموعه استاندارد API را اجرا کند که سایر برنامه ها را قادر به انجام معاملات می کند.
1 2 |
public class My Application extends ContentProvider { } |
URI های محتوا
برای پرس و جو از یک ارائه دهنده محتوا، شما رشته کوئری را به شکل URI مشخص می کنید که دارای قالب زیر است –
1 |
<prefix>://<authority>/<data_type>/<id> |
در اینجا جزئیات قسمت های مختلف URI وجود دارد:
1-prefix
این همیشه :// روی محتوا تنظیم می شود
2-authority
این نام ارائه دهنده محتوا را مشخص می کند، به عنوان مثال مخاطبین، مرورگر و غیره. برای ارائه دهندگان محتوای شخص ثالث، این نام می تواند، مانند com.tutorialspoint.statusprovider
3-data_type
این نشان دهنده نوع داده ای است که این ارائه دهنده خاص ارائه می دهد. به عنوان مثال، اگر تمام مخاطبین را از ارائه دهنده محتوای مخاطب دریافت می کنید، مسیر داده افراد خواهد بود و URI به این شکل است: // contact / people
4-id
رکورد خاص درخواستی را مشخص می کند. به عنوان مثال ، اگر به دنبال مخاطب شماره 5 در ارائه دهنده محتوای مخاطب هستید ، URI ،مانند این محتوا که اینگونه به نظر می رسد: // contact / people / 5.
ایجاد ارائه دهنده محتوا در اندروید
این شامل چندین مرحله ساده برای ایجاد ارائه دهنده محتوای است.
- اول از همه شما باید یک کلاس Content Provider بسازید که ContentProviderbaseclass را گسترش دهد.
- دوم، شما باید آدرس URI ارائه دهنده محتوای خود را تعریف کنید که برای دسترسی به محتوا استفاده می شود.
- در مرحله بعدی شما باید پایگاه داده خود را برای نگهداری محتوا ایجاد کنید. معمولاً اندروید از پایگاه داده SQLite و چارچوب استفاده می کند و باید از روش ()onCreate استفاده کند که از روش SQLite Open Helper برای ایجاد یا باز کردن پایگاه داده ارائه دهنده استفاده می کند. هنگامی که برنامه شما راه اندازی می شود، کنترل کننده ()onCreate هر یک از ارائه دهندگان محتوای آن در بخش اصلی برنامه فراخوانی می شود.
- در مرحله بعدی شما باید برای انجام عملیات خاص مختلف پایگاه داده، پرس و جوهای ارائه دهنده محتوا را پیاده سازی کنید.
- در آخر با استفاده از برچسب <provider> ارائه دهنده محتوای خود را در پرونده فعالیت خود ثبت کنید.
در اینجا لیستی از روشهایی وجود دارد که شما باید در کلاس Content Provider نادیده بگیرید تا ارائه دهنده محتوای شما کار کند.
- ()onCreate هنگام شروع ارائه دهنده این روش فراخوانی می شود.
- ()query این روش درخواستی از کلاین دریافت می کند. نتیجه به عنوان یک شی Cursor بازگردانده می شود.
- ()insert این روش رکورد جدیدی را به ارائه دهنده محتوا وارد می کند.
- ()delete این روش یک رکورد موجود را از ارائه دهنده محتوا پاک می کند.
- ()update این روش یک رکورد موجود را از ارائه دهنده محتوا به روز می کند.
- ()getType این روش نوع MIME داده ها را در URI داده شده برمی گرداند.
مثال
این مثال نحوه ایجاد ContentProvider خود را به شما توضیح می دهد. بنابراین بیایید مراحل زیر را دنبال کنیم.
مراحل | توضیحات |
---|---|
1 | شما از Android Studio IDE برای ایجاد یک برنامه اندروید استفاده می کنید و نام آن را به عنوان My Application تحت یک بسته com.example.MyApplication، با فعالیت خالی کرد |
2 | پرونده فعالیت اصلی MainActivity.java را اصلاح کنید تا دو روش جدید در ()ClickAddName و ()onClickRetrieveStudents اضافه کنید. |
3 | برای تعریف ارائه دهنده واقعی و روش های مرتبط، یک فایل جاوا جدید به نام StudentProvider.java در بسته com.example.MyApplication ایجاد کنید |
4 | با استفاده از برچسب <provider…/> ارائه دهنده محتوای خود را در پرونده AndroidManifest.xml خود ثبت کنید |
5 | محتوای پیش فرض فایل res / layout / activity_main.xml را تغییر دهید تا شامل یک رابط کاربری گرافیکی کوچک برای افزودن سوابق دانشجویان باشد. |
6 | نیازی به تغییر string.xml نیست. Android studio از پرونده string.xml مراقبت می کند. |
7 | برنامه را اجرا کنید تا شبیه ساز اندروید را راه اندازی کنید و نتیجه تغییرات انجام شده در برنامه را تأیید کنید. |
در زیر محتوای پرونده فعالیت اصلی تغییر یافته src / com.example.MyApplication / MainActivity.java است. این پرونده می تواند شامل هر یک از روشهای اساسی چرخه حیات باشد. ما برای کنترل تعامل کاربر با برنامه، دو روش جدید در ()ClickAddName و ()onClickRetrieveStudents را اضافه کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
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 است –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
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…/> را اضافه کرده ایم تا شامل ارائه دهنده محتوای ما شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?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 آورده خواهد شد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
<?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 دارید:
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My Application</string> </resources>; |
بیایید سعی کنیم برنامه خود را اجرا کنیم! من تصور می کنم شما AVD خود را هنگام راه اندازی محیط ایجاد کرده اید. برای اجرای برنامه از Android studio، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.
حالا بیایید Name و Grade دانشجو را وارد کرده و در آخر بر روی دکمه Add Name کلیک کنید، این رکورد دانشجویی را در پایگاه داده اضافه می کند و یک پیام را در پایین فلش می کند که ContentProvider URI را به همراه شماره رکورد اضافه شده در پایگاه داده نشان می دهد. این عملیات از روش ()insert ما استفاده می کند. بیایید این روند را تکرار کنیم تا تعداد بیشتری دانش آموز در پایگاه داده ارائه دهنده محتوای خود اضافه کنیم.
هنگامی که کار شما با اضافه کردن رکوردها در پایگاه داده تمام شد، اکنون وقت آن است که از ContentProvider بخواهیم آن سوابق را به ما بازگرداند، بنابراین بیایید بر روی دکمه Retrieve Students کلیک کنیم که همه رکوردها را یکی یکی دریافت می کند.
به این ترتیب می توانید از ارائه دهنده محتوا موجود مانند آدرس کتاب استفاده کنید یا می توانید از مفهوم ارائه دهنده محتوا در توسعه برنامه های دیتابیس خوب استفاده کنید که در آن می توانید انواع عملیات پایگاه داده مانند خواندن، نوشتن، به روزرسانی و حذف را همانطور که در بالا توضیح داده شده است، انجام دهید.
لیست جلسات قبل آموزش برنامه نویسی اندروید
- نگاهی کلی به برنامه نویسی اندروید
- تنظیمات محیط در برنامه نویسی اندروید
- معماری برنامه نویسی اندروید
- اجزای برنامه در برنامه نویسی اندروید
- Hello World در برنامه نویسی اندروید
- سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
- فعالیت در برنامه نویسی اندروید
- سرویس در برنامه نویسی اندروید
- گیرنده های پخش در برنامه نویسی اندروید
دیدگاه شما