با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. Content Providers یا ارائه دهنده محتوا در اندروید ، جزئی است که داده ها را از یک برنامه به سایر برنامه ها بر اساس درخواست عرضه می کند. چنین درخواست هایی توسط متد های ContentResolver انجام می شود. یک Content Providers می تواند از داده های مختلفی برای ذخیره داده های خود استفاده کند و داده ها را می توان در پایگاه داده، فایل ها یا حتی بیش از یک شبکه ذخیره کرد. جهت آشنایی بیشتر با Content Providers در اندروید در ادامه ی مباحث این آموزش با ما همراه باشید.
در ادامه مباحث ما شما را با ساختار ارائه دهنده محتوا در اندروید، چگونگی ایجاد آن و مثال هایی از این مورد آشنا می کنیم.
نکته:
گاهی لازم است که داده ها را در میان برنامه ها به اشتراک بگذاریم. این جایی است که Content Providers بسیار مفید هستند.
Content Providers به شما اجازه می دهد محتوا را در یک مکان متمرکز کنید.
شما می توانید با برنامه های مختلفی به آن دسترسی داشته باشید.
ارائه دهنده محتوا بسیار شبیه یک پایگاه داده است چراکه در آن شما می توانید داده را درخواست کرده و محتوای آن را ویرایش کنید.
همچنین اضافه کردن یا حذف محتویات با استفاده از متد های () inserter ()، update ()، delete () و () query امکان پذیر است.
در بیشتر موارد این اطلاعات در پایگاه داده SQlite ذخیره می شود.
Content Providers به عنوان یک کلاس زیر کلاس ContentProvider اجرا می شود.
ارائه دهنده محتوا باید یک مجموعه استاندارد از API ها را اجرا کند که سایر برنامه ها را قادر به انجام معاملات می کند.
ساختار تعریف:
1 2 | <span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">My</span> <span class="typ">Application</span> <span class="kwd">extends</span> <span class="typ">ContentProvider</span> <span class="pun">{</span> <span class="pun">}</span> |
Content Providers برای پرس و جو، رشته پرس و جو را به شکل یک URI مشخص می کند که دارای فرمت زیر است:
1 | <span class="tag"><prefix></span><span class="pln">://</span><span class="tag"><authority></span><span class="pln">/</span><span class="tag"><data_type></span><span class="pln">/</span><span class="tag"><id></span> |
در جدول زیر جزئیات بخش های مختلف URI است :
ردیف | بخش ها و توضیحات |
---|---|
۱ | prefix این بخش محتوای تنظیم شده است:// |
۲ | authority این بخش نام content provider را مشخص می کند. به عنوان مثال می تواند یک نام کاربری مانند com.pvlearn.statusprovider باشد.
|
۳ | data_type نوع داده هایی را مشخص می کند که یک content provider خاص ارائه می دهد.
|
۴ | id این یک رکورد خاص از داده های ذخیره شده را مشخص می کند. |
این قسمت شامل مراحل ساده ی ایجاد content provider خود است:
در اینجا لیست متدهایی است که شما باید در کلاس ارائه دهنده محتوا آنها را لحاظ کنید تا Content Provider کار کند:
این یک مثال ساده از چگونگی ایجاد ContentProvider در مثال همیشگی ما یعنی مثال Hello World است:
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کرده و نام پکیج را com.pvlearn.pvlearn.myapplication قرار بدهید. |
۲ | به محتوای فایل MainActivity.java دو متد () onClickAddName و () onClickRetrieveStudents را اضافه کنید. |
۳ | فایلی به نام StudentsProvider.java در پکیج com.pvlearn.pvlearn.myapplication برای تعریف ارائه دهنده ی محتوا و متدهای آن تعریف کنید. |
۴ | ارائه دهنده محتوا خود را در فایل AndroidManifest.xml خود را با استفاده از برچسب <provider … /> ثبت کنید |
۵ | به محتوای فایل res / layout / activity_main.xml یک GUI به منظور افزودن داده ها اضافه کنید. |
۶ | نیازی به تغییر محتوای فایل string.xml نیست. |
۷ | برنامه را اجرا کنید تا شبیه ساز آندروید را راه اندازی کنید و نتیجه تغییرات انجام شده در برنامه را تأیید کنید. |
کد برنامه ی زیر نشان می دهد که ما به محتوای فایل src / com.pvlearn.MyApplication / MainActivity.java دو متد() onClickAddName و () 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.pvlearn.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) { 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) { String URL = "content://com.pvlearn.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()); } } } |
سپس فایل جدید StudentsProvider.java را در زیر پکیج com.pvlearn.MyApplication بصورت زیر اضافه می کنیم:
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 | package com.pvlearn.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.pvlearn.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); } 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);"; 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); db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { long rowID = db.insert( STUDENTS_TABLE_NAME, "", values); 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 == ""){ sortOrder = NAME; } Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder); 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)){ case STUDENTS: return "vnd.android.cursor.dir/vnd.pvlearn.students"; case STUDENT_ID: return "vnd.android.cursor.item/vnd.pvlearn.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.pvlearn.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.pvlearn.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.pvlearn.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=" " 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>; |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
اگر همه چیز بخوبی پیش برود شبیه ساز اندروید پنجره ی زیر را نمایش خواهد داد:
حالا Name و Grade را وارد کنید و در نهایت بر روی دکمه Add Name کلیک کنید.
این رکورد student را در پایگاه داده اضافه می کند و با یک پیام در پایین نمایش URI ContentProvider با تعداد رکورد اضافه شده در پایگاه داده اشاره می کند.
این عملیات با استفاده از متد () insert که اضافه کردیم انجام می شود.
پس از درج داده های مرود نظر با کلیک روی Retrieve Students ارائه دهنده ی محتوا تمام داده های درج شده را نمایش می دهد.
همچنین می توانید فعالیت های به روز رسانی و حذف عملیات را با ارائه توابع فراخوانی آن در فایل MainActivity.java بنویسید.
و در نهایت دکمه ی بروزرسانی و حذف عملیات را نیز در رابط کاربری اضافه کنید.
به این ترتیب می توانید با استفاده از قابلیت های ارائه دهنده محتوا در اندروید برنامه های کاربردی با پایگاه داده ی مناسب ایجاد کنید.
در مباحث این بخش یاد گرفتیم که چه طور با استفاده از Content Providers در اندروید به یک برنامه قابلیت ذخیره و بازیابی داده ها را اضافه کنیم. آشنایی با چگونگی استفاده از ارائه دهنده محتوا در اندروید ، یکی از بخش های اصلی ایجاد برنامه های کاربردی است
MHosein
kheyli awli bood, mamnoon babat in matlab ke be farsi tarjome kardin