زمانی که می خواهید با دیتابیس یک برنامه خارج از اپلیکیشن خودتون ارتباط برقرار کنید از content provider استفاده میکنید مثلا یکیش همین لیست مخاطبین گوشی هست(البته حتما باید مجوز دسترسی در AndroidManifest داده بشه)
یعنی دقیقا سرویس هایی هستند که به راحتی می توانید با استفاده از دستورات t-sql مربوط به sqlite به داده های اون برنامه دسترسی داشته باشید البته با استفاده از URI ها ویا حتی زمانی خواستید خودتون هم سرویس هایی بنویسید که نیاز به ارتباط داده ای داشتند می توانید به راحتی یک provider بنویسید.
Cursor cursor= getContentResolver().query(ContactsContract.Contac ts.CONTENT_URI,null,null,null,null);
در دستور بالا با استفاده از تابع getContentResolver که در سطح اپلیکیشن کلاس هست یک کوئری را اجرا کردید.
while ((cursor.moveToNext())) {
String existName = cursor.getString(cursor.getColumnIndex(ContactsCon tract.Contacts.DISPLAY_NAME));
if (existName.equals(name)) {
Toast.makeText(getApplicationContext(), "Sorry exists", Toast.LENGTH_LONG).show();
return;
}
}
در حلقه فوق هم فیلد نام مخاطب در تک تک رکوردهای جدول مخاطبین با نام ورودی جدید مقایسه می شود که تکراری نباشد.
ops.add(ContentProviderOperation.newInsert(Contact sContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TY PE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NA ME, null).build());
ACCOUNT_TYPE , ACCOUNT_NAME را در ContactsContract.RawContacts
ops.add(ContentProviderOperation.newInsert(Contact sContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_ CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CO NTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Struct uredName.DISPLAY_NAME, name).build());
RAW_CONTACT_ID که برابر با تعداد لیست مخاطبین هست و MIMETYPE در ContactsContract.Data و DISPLAY_NAME در بانک CommonDataKinds.StructuredName
ops.add(ContentProviderOperation.newInsert(Contact sContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_ CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITE M_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone. NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone. TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE ).build());
NUMBER , TYPE در CommonDataKinds.Phone
ذخیره خواهند شد و برای اینکه بتوانید اطلاعات جدید را در جداول مخاطبین گوشی اضافه کنید نیاز به یک ArrayList دارید که باید نام مخاطب و شماره مخاطب و نوع و Kind مخاطب را در جدوال مورد نظر اضافه کنید.
ودر آخر هم
getContentResolver().applyBatch(ContactsContract.A UTHORITY,ops);
با استفاده از متد applyBatch می توانید ArrayList خود راکه fill کرده اید در provider مورد نظر ذخیره نمایید.
پس بنابراین در تکمیل پاسخ باید عرض کنم شما با استفاده از contentProvider ها مستقیما با نام جداول provider موردنظرتون کاری ندارید بجاش از URI هایی استفاده میکنید که به جدوال مورد نظر اشاره میکنند مانند ContactsContract.CommonDataKinds.StructuredName