PDA

View Full Version : اضافه کردن مخاطب با استفاده از content provider



kamran_14
یک شنبه 16 دی 1397, 20:59 عصر
سلام
خسته نباشید
Content Provider
این کد برای اضافه کردن یک مخاطبه
من اصلا متوجه این کد نشدم دوستان
به نظر می آد Content provider خیلی سخت باشه
هر ops.add در واقع یک ستون رو اد میکنه؟
میشه این کدرو توضیح بدید. ممنون:

private void addContacts(String name,String phone) {
Cursor cursor= getContentResolver().query(ContactsContract.Contac ts.CONTENT_URI,null,null,null,null);
int count=cursor.getCount();
if (count>0)
{
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;
}
}
ArrayList<ContentProviderOperation> ops=new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex=ops.size();
ops.add(ContentProviderOperation.newInsert(Contact sContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TY PE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NA ME, null).build());
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());
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());


try {
getContentResolver().applyBatch(ContactsContract.A UTHORITY,ops);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
Toast.makeText(this,"Created",Toast.LENGTH_LONG).show();
}
}

kamran_14
یک شنبه 30 دی 1397, 12:27 عصر
آیا ContactsContract.Data.DISPLAY_NAME یعنی ستون DISPLAY_NAME موجود در جدول Data ؟ و ContactsContract.Contacts.DISPLAY_NAME یعنی ستون DISPLAY_NAME موجود در جدل Contacts؟
الان Contacts و Data دو جدول متفاوتند؟ در جدول Contact مخاطبها ذخیره میشود پس در جدول Data چه چیزی؟

farhad_shiri_ex
یک شنبه 30 دی 1397, 17:16 عصر
زمانی که می خواهید با دیتابیس یک برنامه خارج از اپلیکیشن خودتون ارتباط برقرار کنید از 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

kamran_14
دوشنبه 01 بهمن 1397, 08:10 صبح
خیلی ممنون از اینکه جواب دادید
در این برنامه دیتابیس و جدول هم وجود داره؟ منظورم اینه که آیا ContactsContract همون دیتابیسه؟ و Contacts جدول؟
و
ContactsContract.Contacts.DISPLAY_NAME با ContactsContract.Data.DISPLAY_NAME چه فرقی دارد؟
ContactsContract.RawContacts هم یک جدوله؟


ops.add(ContentProviderOperation.newInsert(Contact sContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TY PE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NA ME, null).build());


در دستور فوق نام ستون در RawContacts ذخیره میشوند؟ منظورم اینه که آیا Account_TYPE و ACCOUNT_NAME نام ستونند؟
معذرت میخوام من خیلی مبتدی هستم فهمیدنش سخته برام ولی میخوام یاد بگیرم. ممنون