【发布时间】:2019-01-18 17:26:49
【问题描述】:
我在电话簿中保存了大约 250 个联系人。每个联系人大约需要 1 秒钟才能保存在联系人列表中。在我的应用程序中,我可能需要保存超过 10,000 个联系人。然后需要几个小时才能保存它们。所以,我想要一种快速保存所有联系人的方法。你的回答对我很有帮助:)
这是我使用 for 循环保存联系人的方法 -
public static String saveNewContact(String name, String number, ContentResolver contentResolver){
ContentValues values = new ContentValues();
values.put(Contacts.People.NUMBER, number);
values.put(Contacts.People.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM);
values.put(Contacts.People.LABEL, name);
values.put(Contacts.People.NAME, name);
Uri dataUri = contentResolver.insert(Contacts.People.CONTENT_URI, values);
Uri updateUri = Uri.withAppendedPath(dataUri, Contacts.People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(Contacts.People.Phones.TYPE, Contacts.People.TYPE_MOBILE);
values.put(Contacts.People.NUMBER, number);
updateUri = contentResolver.insert(updateUri, values);
return getContactID(updateUri, contentResolver);
}
public static String getContactID(Uri contactUri, ContentResolver contentResolver){
String id = "";
Cursor cursor = contentResolver.query(contactUri, null,
null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int idx = cursor.getColumnIndex(ContactsContract.Contacts._ID);
id = cursor.getString(idx);
}
return id;
}
编辑 - 也尝试了此代码,但结果相同
ArrayList<ContentProviderOperation> cntProOper = new ArrayList<>();
int contactIndex = cntProOper.size();
cntProOper.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());
cntProOper.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, contactIndex)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
.build());
cntProOper.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, contactIndex)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, number)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build()); //Type like HOME, MOBILE etc
try {
contentResolver.applyBatch(ContactsContract.AUTHORITY, cntProOper);
} catch (RemoteException | OperationApplicationException exp) {}
【问题讨论】:
-
我已经发布了 getContactID 方法。请检查
-
他们都返回了正确的值。并且删除
getContactID方法没有奏效。耗时相同 -
另外,我尝试过使用另一段代码。但结果是一样的
标签: android performance android-contacts contactscontract