تأمین کننده های محتوا
تأمین کننده های محتوا
در آموزش قبل راه های گوناگون ذخیره سازی اطلاعات را کار کردیم.زمانی از روش دیتابیس استفاده میکردیم که دارای اطلاعات ساختار یافته و پیچیده بودیم.اما در این روش, به اشتراک گذاری اطلاعات یک چالش بزرگی محسوب می شود زیرا تنها برنامه ای که بانک را ایجاد کرده است اجازه دسترسی به آن را دارد.
در این قسمت از آموزش روش های به اشتراک گذاری اطلاعات در اندروید را از طریق تأمین کننده های محتوا را بررسی می کنیم.چگونگی استفاده از تأمین کننده های محتوای توکار را بررسی می کنیم و اینکه چگونه خودتان یک تأمین کننده محتوا برای به اشتراک گذاری اطلاعات ایجاد نمایید.
به اشتراک گذاری اطلاعات در اندروید
در اندروید استفاده از تأمین کننده های محتوا برای به اشتراک گذاری اطلاعات توصیه می شود.تصور کنید که یک تأمین کننده ی محتوا شبیه به یک منبع اطلاعاتی است و ذخیره سازی اطلاعات ربطی به نحوه ی استفاده و استفاده کننده آن ندارد.چیزی که ایجا حائز اهمیت است این است که چطور برنامه های مختلف به این منبع اطلاعاتی دسترسی داشته باشند.یک تأمین کننده ی محتوا شباهت زیادی به بانک اطلاعاتی دارد.چرا که می توانید از آن کوئری گرفته,محتوای آن را ویرایش کرده و عملیات افزودن و حذف را روی اطلاعات آن انجام دهید.البته بر خلاف بانک اطلاعاتی, روش های مختلفی را برای ذخیره سازی می توان پیش بینی نمود.چرا که قابلیت ذخیره شدن در یک بانک اطلاعاتی, در فایل و یا در یک شبکه را دارد.اندروید خود دارای چندین تأمین کننده محتوا است که در زیر نام برده شده است:
- Browser یا مرورگر -- اطلاعاتی از قبیل BookMark های مرورگر, تاریخچه صفحات بازدید شده و ... را نگهداری می کند.
- CallLog یا لاگ تماس -- اطلاعاتی از قبیل تماس های از دست رفته , جزئیات تماس و ... را نگهداری می کند.
- Contacts یا مخاطبین -- جزئیات اطلاعات مخاطبین را نگهداری می کند.
- MediaStor یا انباره ی رسانه ها -- اطلاعات رسانه ای مانند موسیقی, فیلم و عکس را ذخیره می کند.
- Settings یا تنظیمات -- تنظیمات سیستم را ذخیره می کند.
علاوه بر موارد بالا که به صورت توکار در اندروید وجود دارند, خودتان نیز می توانید تأمین کننده ی محتوای مختص به خودتان را ایجاد کنید.
برای کوئری گرفتن از یک تأمین کننده محتوا, باید رشته کوئری را در قالب یک URL در آورید که که دارای پارامترهای صریح است.قالب یک کوئری URL به شکل زیر است:
<standard_prefix>://<authority>/<data_path>/<id>
بخش های مختلف قالب یک کوئری URL به شرح زیر است:
- قسمت standard prefix همیشه برای تأمین کنندگان محتوا است که برابر content:// است.
- قسمت Authority مشخص کننده ی نام تأمین کننده است.برای مثال کلمه contact برای دسترسی به مخاطبین می باشد.برای دسترسی به تأمین کننده سوم, باید نام کامل آنها مثلاً com.wrox.provider یا net.learn2develop.provider درج گردد.
- قسمت data path نوع اطلاعات درخواست شده را تعیین می کند.برای مثال اگر قصد دارید اطلاعات تمامی مخاطبین را از تأمین کنندهی محتوا Contents بگیرید, نوع اطلاعات شما از نوع people خواهد بود و URL نتیجه چیزی شبیه content://contents.people خواهد بود.
- قسمت id مشخص کننده ی رکورد درخواست شده است.برای مثال اگر به دنبال مخاطب دوم هستید, URL نتیجه چیزی شبیه به content://contents.people/2 خواهد بود.
استفاده از یک تأمین کننده محتوا
بهترین راه درک مفهوم تأمین کننده محتوا, استفاده کردن از یکی از آنهاست.در تمرین زیر ملاحظه می فرمائید که چگونه از یک تأمین کننده محتوا در برنامه ی خود استفاده کنید:
1.با استفاده از اکلیپس یک پروژه جدید با نام Provider ایجاد کنید.
2.فایل main.xml را به صورت زیر ویرایش کنید:
<?xml version=”1.0” encoding=”utf-8”?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
>
<ListView
android:id=”@+id/android:list”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:layout_weight=”1”
android:stackFromBottom=”false”
android:transcriptMode=”normal”
/>
<TextView
android:id=”@+id/contactName”
android:textStyle=”bold”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
/>
<TextView
android:id=”@+id/contactID”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
/>
</LinearLayout>
3.فایل MainActivity.java را به صورت زیر ویرایش کنید:
package com.PRG.Provider;
import android.app.Activity;
import android.os.Bundle;
import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri allContacts = Uri.parse(“content://contacts/people”);
Cursor c = managedکوئری(allContacts, null, null, null, null);
String[] columns = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID};
int[] views = new int[] {R.id.contactName, R.id.contactID};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, R.layout.main, c, columns, views);
this.setListAdapter(adapter);
}
}
4.فایل AndroidManifest.xml را به صورت زیر ویرایش کنید:
<?xml version=”1.0” encoding=”utf-8”?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”net.learn2develop.Provider”
android:versionCode=”1”
android:versionName=”1.0”>
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<activity android:name=”.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>
</application>
<uses-sdk android:minSdkVersion=”7” />
<uses-permission android:name=”android.permission.READ_CONTACTS”>
</uses-permission>
</manifest>
5.شبیه ساز را راه اندازی کرده و در قسمت مخاطبین چند مورد جدید ثبت کنید.برای اضافه کردن مخاطب, برنامه phone را اجرا کرده و روی دکمه ی ستاره که در بالا قرار دارد بزنید.دکمه ی MENU را در شبیه ساز کلیک کنید, سپس گزینه New contact را انتخاب کنید, هشداری در مورد پشتیبانی گرفتن از اطلاعات به شما نمایش داده می شود.دکمه ی Keep local را بزنید.نام, شماره تلفن و آدرس ایمیل را برای چند نفر وارد کنید.
6.برنامه را در شبیه ساز اجرا کنید.شکل زیر اکتیویتی را در حال نمایش لیستی از مخاطبین ایجاد شده نشان می دهد.
روش کار
در این مثال تمام مخاطبینی که در برنامه Contacts ذخیره شده بود را استخراج کرده و در یک ListView نمایش دادیم.
از متد ()managedکوئری از کلاس Activity برای دسترسی به Cursor مدیریت شده استفاده کنید.یک مدیریت Cursor همه ی امور مربوط به تخلیه شدن از حافظه را انجام می دهد.سپس برنامه نگه داشته می شود و خود را از حافظه خارج می کند و بعد دوباره راه اندازی می شود.
Cursor c = managedکوئری(allContacts, null, null, null, null);
برابر است با:
equivalent to
Cursor c = getContentResolver().کوئری(allContacts, null, null, null, null);
startManagingCursor(c); //---allows the activity to manage the Cursor’s
// lifecyle based on the activity’s lifecycle---
متد ()getContentResolver یک شئ ContentResolver را بر میگرداند. که به اینجا URL مناسب با توجه به تأمین کننده محتوا کمک خواهد کرد.
شئ SimpleCursorAdapter یک Cursor را به TextView (یا ImageView)که در فایل XML تعریف شده است, نگاشت می کند.در حقیقت اطلاعات را به ابزارهای نمایش نگاشت می کند:
String[] columns = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID};
int[] views = new int[] {R.id.contactName, R.id.contactID};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, R.layout.main, c, columns, views);
this.setListAdapter(adapter);
برای اینکه برنامه شما اجازه دسترسی به برنامه Contacts را داشته باشد,نیاز دارید که مجوز READ_CONTACTS را در فایل AndroidManifest.xml صادر کنید.
متغیر های ثابت رشته های کوئری از پیش تعریف شده
علاوه بر استفاده از کوئری URL, می توانید از یک لیست از پیش تعریف شده متغیرهای ثابت اندروید که URL های متفاوتی از انواع داده ای مختلف را تعریف می کنند, استفاده کنید (در حقیقت یک سری از URL های متداول به صورت متغیرهای ثابت تعریف شده اند).برای مثال علاوه بر استفاده از کوئری contact://contacts/people می توانید از عبارت زیر هم استفاده کنید:
Uri allContacts = Uri.parse(“content://contacts/people”);
می توانید برای استفاده از متغیرهای ثابت از پیش تعریف شده اندروید به روش زیر عمل کنید:
Uri allContacts = ContactsContract.Contacts.CONTENT_URI;
چند مثال از ثابت های رشته ی کوئری به صورت زیر است:
- Browser.BOOKMARKS_URL
- Browser.SEARCHES_URL
- CallLog.CONTACT_URL
- MediaStore.Image.Media.INTERNAL_CONTENT_URL
- MediaStore.Image.Media.EXTERNAL_CONTENT_URL
- Settings.CONTENT_URL
اگر می خواهید اولین رکورد را استخراج کنید,ID آن را مشخص کنید:
Uri oneContact = Uri.parse(“content://contacts/people/1”);
به غیر از این,از متغیر های ثابت از پیش تعریف شده و متد () withAppendedId کلاس ContentUris نیز می توانید استفاده کنید:
import android.content.ContentUris;
//...
Uri oneContact = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, 1);
علاوه بر اتصال به یک ListView, می توانید نتایج را به وسیله ی شئ Cursor نیز چاپ کنید.مثل زیر:
package com.PRG.Provider;
import android.app.Activity;
import android.os.Bundle;
import android.app.ListActivity;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.widget.SimpleCursorAdapter;
import android.util.Log;
public class MainActivity extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Uri allContacts = ContactsContract.Contacts.CONTENT_URI;
Cursor c = managedQuery(
allContacts, null, null, null, null);
String[] columns = new String[] {
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts._ID};
int[] views = new int[] {R.id.contactName, R.id.contactID};
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, R.layout.main,
c, columns, views);
this.setListAdapter(adapter);
PrintContacts(c);
}
private void PrintContacts(Cursor c)
{
if (c.moveToFirst()) {
do{
String contactID = c.getString(c.getColumnIndex(
ContactsContract.Contacts._ID));
String contactDisplayName =
c.getString(c.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.v(“Content Providers”, contactID + “, “ +
contactDisplayName);
} while (c.moveToNext());
}
}
}
متد ()printContacts عبارات زیر را در پنجره ی LogCat چاپ می کند:
12-13 02:40:36.825: VERBOSE/Content Providers(497):
1, Wei-Meng Lee
12-13 02:40:36.825: VERBOSE/Content Providers(497):
2, Sally Jackson
در این قسمت شناسه و نام هر مخاطب که در برنامه Contacts ذخیره شده بود, در این پنجره چاپ شد.در این مثال از ContactsContract.Contacts._ID برای دسترسی به فیلد ID یک مخاطب و از ContactsContract.Contacts.DISPLAY_NAME نیز برای دسترسی به نام مخاطب استفاده کردیم.اگر مایل هستید تا شماره تلفن مخاطب را هم نمایش دهید, باید دوباره از تأمین کننده محتوا کوئری بگیرید.چون که این اطلاعات در جدول دیگری ذخیره شده است:
private void PrintContacts(Cursor c)
{
if (c.moveToFirst()) {
do{
String contactID = c.getString(c.getColumnIndex(
ContactsContract.Contacts._ID));
String contactDisplayName =
c.getString(c.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.v(“Content Providers”, contactID + “, “ +
contactDisplayName);
//---get phone number---
int hasPhone =
c.getInt(c.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone == 1) {
Cursor phoneCursor =
getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + “ = “ +
contactID, null, null);
while (phoneCursor.moveToNext()) {
Log.v(“Content Providers”,
phoneCursor.getString(
phoneCursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
phoneCursor.close();
}
} while (c.moveToNext());
}
}
}
نکته:برای دسترسی به شماره هر مخاطب, باید یک کوئری با استفاده از ContactsContract.CommonDataKinds.Phone.CONTENT_URI. بگیرید.
در قطعه کد بالا, ابتدا با استفاده از فیلد ContactsContract.Contacts.HAS_PHONE_NUMBER کنترل کردیم که آیا مخاطب دارای شماره تلفن است یا خیر.اگر مخاطب حداقل یک شماره داشته باشد, می توانید یک کوئری از تأمین کننده ی محتوای Contacts بر اساس شناسه ID بگیرید.وقتی که شماره تلفن ها استخراج شد,سپس آنها را چاپ می کنیم.بعد از آن چیزی شبیه زیر خواهید دید:
12-13 02:41:09.541: VERBOSE/Content Providers(546):
1, Wei-Meng Lee
12-13 02:41:09.541: VERBOSE/Content Providers(546):
969-240-65
12-13 02:41:09.541: VERBOSE/Content Providers(546):
2, Sally Jackson
12-13 02:41:09.541: VERBOSE/Content Providers(546):
345-668-43
پروجکشن ها
آرگومان دوم متد ()managedQuery کنترل می کند که چند ستون به واسطه جواب کوئری برگردانده شود.این آرگومان را پروجکشن می گویند.تا کنون مقدار آن را null قرار میدادیم:
Cursor c = managedQuery(allContacts,
null, null, null, null);
می توانید به صورت صریح نام ستون هایی که باید برگردانده شوند را تعیین کنید.این کار را با ایجاد آرایه ای که حاوی نام ستون ها باشد,انجام می دهیم:
String[] projection = new String[]
{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER};
Cursor c = managedQuery(allContacts, projection,
null, null, null);
در مثال بالا ستون ها ID, DISPLAY_NAME و HAS_PHONE_NUMBER استخراج می شوند.
فیلترینگ
آرگومان های سوم و چهارم از متد()managedQuery به شما این اجازه را می دهد تا از عبارت WHERE اس کیو ال برای فیلتر کردن نتایج کوئری استفاده کنید.برای مثال کوئری زیر فقط اطلاعات افرادی را استخراج می کند که نام آنها با Lee خاتمه یابد:
Cursor c = managedQuery(allContacts, projection,
ContactsContract.Contacts.DISPLAY_NAME + “ LIKE ‘%Lee’”,
null, null);
در اینجا آرگومان سوم حاوی یک عبارت SQL است که حاوی عبارت جستجو برای Lee می باشد.می توانید رشته جستجوی خود را در آرگومان بعدی قرار دهید:
Cursor c = managedQuery(allContacts, projection,
ContactsContract.Contacts.DISPLAY_NAME + “ LIKE ?”,
new String[] {“%Lee”} , null);
مرتب سازی
آخرین آرگومان متد ()managedQuery به شما این اجازه را می دهد تا از عبارت ORDER BY اس کیو ال برای مرتب سازی نتایج کوئری استفاده کنید.برای مثال عبارات زیر مخاطبین را بر اساس نام آنها مرتب می کند:
Cursor c = managedQuery(
allContacts,
projection,
ContactsContract.Contacts.DISPLAY_NAME + “ LIKE ?”,
new String[] {“%”} ,
ContactsContract.Contacts.DISPLAY_NAME + “ ASC”);
To sort in descending order, use the DESC keyword:
Cursor c = managedQuery(
allContacts,
projection,
ContactsContract.Contacts.DISPLAY_NAME + “ LIKE ?”,
new String[] {“%”} ,
ContactsContract.Contacts.DISPLAY_NAME + “ DESC”);
- نوشته شده توسط سعید نوشادی
- بازدید: 7444