如何在android中仅使用1个SQLite命令获取联系人的所有信息?
我已经建立了一个android应用程序。它将从(我手机的)默认通讯簿中获取所有联系人(1000个联系人)。然后,我在(我的应用程序的)列表视图中显示所有这些内容。但是,我花了大约13秒在列表视图上加载和显示。在下面的代码中,我使用了3个命令来查询:每个联系人的姓名、电话号码和公司。我想这就是我的应用程序花费太多时间在listview上加载和显示数据的原因 我有两个问题:如何在android中仅使用1个SQLite命令获取联系人的所有信息?,android,contact,Android,Contact,我已经建立了一个android应用程序。它将从(我手机的)默认通讯簿中获取所有联系人(1000个联系人)。然后,我在(我的应用程序的)列表视图中显示所有这些内容。但是,我花了大约13秒在列表视图上加载和显示。在下面的代码中,我使用了3个命令来查询:每个联系人的姓名、电话号码和公司。我想这就是我的应用程序花费太多时间在listview上加载和显示数据的原因 我有两个问题: 如何在android中仅使用1个SQLite命令获取联系人的所有信息 有没有办法更快地将数据加载和显示到listview上 这
public void addNewContacts(String name, String phone, String com){
String DisplayName = name;
String MobileNumber = phone;
String company = com;
String jobTitle = "Engineer";
ArrayList < ContentProviderOperation > ops = new ArrayList < ContentProviderOperation > ();
ops.add(ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
//------------------------------------------------------ Names
if (DisplayName != null) {
ops.add(ContentProviderOperation.newInsert(
ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
DisplayName).build());
}
//------------------------------------------------------ Mobile Number
if (MobileNumber != null) {
ops.add(ContentProviderOperation.
newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, MobileNumber)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
}
//------------------------------------------------------ Organization
if (!company.equals("") && !jobTitle.equals("")) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company)
.withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK)
.withValue(ContactsContract.CommonDataKinds.Organization.TITLE, jobTitle)
.withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK)
.build());
}
// Asking the Contact provider to create a new contact
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
Log.e("ERROR: ", e.getMessage());
}
}
public void addNewContacts(字符串名称、字符串电话、字符串com){
字符串DisplayName=name;
字符串MobileNumber=电话;
字符串company=com;
字符串jobTitle=“工程师”;
ArrayListops=新建ArrayList();
ops.add(ContentProviderOperation.newInsert(
Contacts contract.raw contacts.CONTENT\u URI)
.withValue(contacts contract.raw contacts.ACCOUNT_TYPE,null)
.withValue(contacts contract.raw contacts.ACCOUNT\u NAME,null)
.build());
//------------------------------------------------------名字
if(DisplayName!=null){
ops.add(ContentProviderOperation.newInsert(
contacts contract.Data.CONTENT\u URI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.带值(contacts contract.Data.MIMETYPE,
ContactsContract.CommonDataTypes.StructuredName.CONTENT\u ITEM\u TYPE)
.有价值(
Contacts contract.CommonDataTypes.StructuredName.DISPLAY\u NAME,
DisplayName.build());
}
//------------------------------------------------------手机号码
if(MobileNumber!=null){
添加(ContentProviderOperation)。
newInsert(ContactsContract.Data.CONTENT\u URI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.带值(contacts contract.Data.MIMETYPE,
Contacts contract.CommonDataTypes.Phone.CONTENT\u ITEM\u TYPE)
.withValue(contacts contract.commonDataTypes.Phone.NUMBER,MobileNumber)
.带值(contacts contract.commondatatypes.Phone.TYPE、,
Contacts contract.CommonDataTypes.Phone.TYPE\手机)
.build());
}
//------------------------------------------------------组织机构
如果(!company.equals(“”)&!jobTitle.equals(“”){
添加(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT\uURI)
.带ValueBackReference(contacts contract.Data.RAW\u CONTACT\u ID,0)
.带值(contacts contract.Data.MIMETYPE,
ContactsContract.CommonDataTypes.Organization.CONTENT\u ITEM\u TYPE)
.withValue(contacts contract.commonDataTypes.Organization.COMPANY,COMPANY)
.withValue(ContactsContact.CommonDataTypes.Organization.TYPE,ContactsContact.CommonDataTypes.Organization.TYPE\U工作)
.withValue(ContactsContract.CommonDataTypes.Organization.TITLE、jobTitle)
.withValue(ContactsContact.CommonDataTypes.Organization.TYPE,ContactsContact.CommonDataTypes.Organization.TYPE\U工作)
.build());
}
//要求联系人提供商创建新联系人
试一试{
getContentResolver().applyBatch(contacts contract.AUTHORITY,ops);
}捕获(例外e){
Log.e(“错误:,e.getMessage());
}
}
我认为你不能这样做,否则事情应该会很复杂
在获取任何信息之前,我需要验证名称是否至少存在
以下是我使用的代码:
public class ContactListControl {
/** be sure that final fields equal to input_display_name */
private final static String NAME = "name";
private final static String GMAIL = "gmail";
private final static String PHONE = "phone";
private ContactListControl(){}
public static void onGetContactInfo(Intent data, Context context, List<InputView> inputViewList) {
Map<String, String> contactDataMap = new HashMap<String, String>();
ContentResolver cr = context.getContentResolver();
Uri contactData = data.getData();
//Cursor cursor = managedQuery(contactData, null, null, null, null);
Cursor cursor = cr.query(contactData, null, null, null, null);
cursor.moveToFirst();
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
String id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
contactDataMap.put(NAME, (name != null)?name:"");
if (Integer.parseInt(cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id},
null);
while (pCur.moveToNext()) {
String number = pCur.getString(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactDataMap.put(PHONE, (number != null)?number:"");
break; // ? we want only 1 value
}
pCur.close();
}
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[]{id}, null);
while (emailCur.moveToNext()) {
// This would allow you get several email addresses
// if the email addresses were stored in an array
String email = emailCur.getString(
emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
contactDataMap.put(GMAIL, (email != null)?email:"");
break;// ? we want only 1 value
}
emailCur.close();
cursor.close();
Log.d("activity result","onActivityResult - got contact: "+contactDataMap.get(NAME) + "; " + contactDataMap.get(GMAIL) + "; " + contactDataMap.get(PHONE));
InputView outputViewName = getInputputViewByDisplayName(NAME, inputViewList);
String tempName = onGetContactInfoAppend(outputViewName, contactDataMap.get(NAME));
outputViewName.setValue(tempName);
InputView outputViewGmail = getInputputViewByDisplayName(GMAIL, inputViewList);
String tempGmail = onGetContactInfoAppend(outputViewGmail, contactDataMap.get(GMAIL));
outputViewGmail.setValue(tempGmail);
InputView outputViewPhone = getInputputViewByDisplayName(PHONE, inputViewList);
String tempPhone = onGetContactInfoAppend(outputViewPhone, contactDataMap.get(PHONE));
outputViewPhone.setValue(tempPhone);
}
private static String onGetContactInfoAppend(InputView outputView, String contactData) {
if(contactData == null){
contactData = "";
}
String temp = outputView.getValue();
//if(!"".equals(contactData)){
if(!"".equals(temp)){
temp = temp + " | ";
}
temp = temp + contactData;
//}
return temp;
}
private static InputView getInputputViewByDisplayName(String displayName, List<InputView> inputViewList) {
for (InputView inputView : inputViewList){
if (inputView.getDisplayName().equals(displayName)){
return inputView;
}
}
return null;
}
}
公共类ContactListControl{
/**确保最终字段等于输入\显示\名称*/
私有最终静态字符串NAME=“NAME”;
私有最终静态字符串GMAIL=“GMAIL”;
专用最终静态字符串PHONE=“PHONE”;
私有ContactListControl(){}
公共静态void onGetContactInfo(意图数据、上下文上下文、列表inputViewList){
Map contactDataMap=新HashMap();
ContentResolver cr=context.getContentResolver();
Uri contactData=data.getData();
//Cursor Cursor=managedQuery(contactData,null,null,null,null);
Cursor Cursor=cr.query(contactData,null,null,null);
cursor.moveToFirst();
字符串名称=cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_name));
String id=cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._id));
contactDataMap.put(名称,(名称!=null)?名称:“”);
if(Integer.parseInt(cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))>0){
游标pCur=cr.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
无效的
ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”,
新字符串[]{id},
无效);
while(pCur.moveToNext()){
String number=pCur.getString(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataTypes.Phone.number));
contactDataMap.put(电话,(号码!=null)?号码:);
break;//?我们只需要1个值
}
pCur.close();
}
游标emailCur=cr.query(
ContactsContract.CommonDataTypes.Email.CONTENT\u URI,
无效的
ContactsContract.CommonDataTypes.Email.CONTACT_ID+“=?”,
新字符串[]{id},null);
while(emailCur.moveToNext()){