如何在android中仅使用1个SQLite命令获取联系人的所有信息?

如何在android中仅使用1个SQLite命令获取联系人的所有信息?,android,contact,Android,Contact,我已经建立了一个android应用程序。它将从(我手机的)默认通讯簿中获取所有联系人(1000个联系人)。然后,我在(我的应用程序的)列表视图中显示所有这些内容。但是,我花了大约13秒在列表视图上加载和显示。在下面的代码中,我使用了3个命令来查询:每个联系人的姓名、电话号码和公司。我想这就是我的应用程序花费太多时间在listview上加载和显示数据的原因 我有两个问题: 如何在android中仅使用1个SQLite命令获取联系人的所有信息 有没有办法更快地将数据加载和显示到listview上 这

我已经建立了一个android应用程序。它将从(我手机的)默认通讯簿中获取所有联系人(1000个联系人)。然后,我在(我的应用程序的)列表视图中显示所有这些内容。但是,我花了大约13秒在列表视图上加载和显示。在下面的代码中,我使用了3个命令来查询:每个联系人的姓名、电话号码和公司。我想这就是我的应用程序花费太多时间在listview上加载和显示数据的原因

我有两个问题:

  • 如何在android中仅使用1个SQLite命令获取联系人的所有信息
  • 有没有办法更快地将数据加载和显示到listview上
  • 这是要查询的代码:姓名、电话号码、联系人所在公司。查询结果将存储到游标中。然后我使用光标设置listAdapter

    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()){