如何只用1 SQLite的命令来获得一个机器人接触的所有信息? [英] How to get all information of an contact in android by using only 1 SQLite command?

查看:91
本文介绍了如何只用1 SQLite的命令来获得一个机器人接触的所有信息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经建立了一个Android应用程序。它会得到默认地址簿(我的手机)的所有联系人(1000接触)。然后,我显示在列表视图(我的应用程序)所有。但是,我花费约13S加载和显示在列表视图。在我的下面code,我用了3个命令来查询:产品名称,每个联系人的电话号码和公司。我想这就是为什么我的应用程序,它花太多时间来加载和列表视图显示数据的原因。

我有2个问题:


  1. 如何只用1 SQLite的命令来获得一个机器人接触的所有信息?

  2. 有没有加载任何方式和显示数据的列表视图上快???

这是code查询:姓名,电话没有,公司联系。查询的结果将被存储到一个光标。然后我用光标设置listAdapter。

 公共无效addNewContacts(字符串名称,字符串电话,弦乐COM){
    字符串显示名称=名称;
     字符串移动电话号码=手机;
     字符串公司= com的;
     字符串JOBTITLE =工程师;     ArrayList的< ContentProviderOperation> OPS =新的ArrayList< ContentProviderOperation> ();     ops.add(ContentProviderOperation.newInsert(
     ContactsContract.RawContacts.CONTENT_URI)
         .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,NULL)
         .withValue(ContactsContract.RawContacts.ACCOUNT_NAME,NULL)
         。建立());     // ------------------------------------------------ ------名称
     如果(显示名称!= 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,
         显示名称).build());
     }     // ------------------------------------------------ - - - 手机号
     如果(移动电话号码!= 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,移动电话号码)
             .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
         ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
             。建立());
     }     // ------------------------------------------------ ------组织
     如果(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,公司)
             .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)
             。建立());
     }     //问联系人提供商创建新的联系人
     尝试{
         。getContentResolver()applyBatch(ContactsContract.AUTHORITY,OPS);
     }赶上(例外五){
         Log.e(错误:,e.getMessage());
     }
}


解决方案

我不这么认为你可以,也应该是复杂的。

在读取的任何信息,我需要验证,如果名称中至少存在。

下面是code我用:

 公共类ContactListControl {/ **确保final字段等于input_display_name * /
私人最终静态字符串NAME =名;
私人最终静态字符串GMAIL =Gmail的;
私人最终静态字符串PHONE =手机;私人ContactListControl(){}公共静态无效onGetContactInfo(意向数据,上下文的背景下,列表与LT; InputView> inputViewList){    地图<字符串,字符串> contactDataMap =新的HashMap<字符串,字符串>();    ContentResolver的CR = context.getContentResolver();    乌里联络资料= data.getData();
    //光标指针= managedQuery(联络资料,NULL,NULL,NULL,NULL);
    光标光标= cr.query(联络资料,NULL,NULL,NULL,NULL);
    cursor.moveToFirst();
    字符串名称= cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
    字符串ID = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));    contactDataMap.put(NAME(名称= NULL)名称:!?);
    如果(的Integer.parseInt(cursor.getString(
            cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)))> 0){
        光标pCur = cr.query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                空值,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID +=?,
                                新的String [] {ID},
                                空值);        而(pCur.moveToNext()){
            串号= pCur.getString(pCur.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));            contactDataMap.put(电话,(数量= NULL)号:!?);
            打破; //?我们只想要1值
        }
        pCur.close();
    }    光标emailCur = cr.query(
                                ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                空值,
                                ContactsContract.CommonDataKinds.Email.CONTACT_ID +=?,
                                新的String [] {ID},NULL);    而(emailCur.moveToNext()){
        //这将让你得到一些电子邮件地址
        //如果电子邮件地址被存储在一个阵列
        字符串email = emailCur.getString(
                emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));        contactDataMap.put(GMAIL,(电子邮件= NULL)电子邮件:!?);
        打破; //?我们只想要1值
    }
    emailCur.close();    cursor.close();
    Log.d(活动结果,的onActivityResult - 有联系:+ contactDataMap.get(NAME)+,+ contactDataMap.get(GMAIL)+,+ contactDataMap.get(电话));
    InputView outputViewName = getInputputViewByDisplayName(姓名,inputViewList);
    字符串tempName = onGetContactInfoAppend(outputViewName,contactDataMap.get(名));
    outputViewName.setValue(tempName);    InputView outputViewGmail = getInputputViewByDisplayName(GMAIL,inputViewList);
    串tempGmail = onGetContactInfoAppend(outputViewGmail,contactDataMap.get(GMAIL));
    outputViewGmail.setValue(tempGmail);
    InputView outputViewPhone = getInputputViewByDisplayName(电话,inputViewList);
    字符串tempPhone = onGetContactInfoAppend(outputViewPhone,contactDataMap.get(电话));
    outputViewPhone.setValue(tempPhone);
}私人静态字符串onGetContactInfoAppend(InputView outputView,串联络资料){    如果(联络资料== NULL){
        联络资料=;
    }    字符串TEMP = outputView.getValue();    //如果(!。等于(联络资料)){
        如果(!。等于(TEMP)){
            TEMP =温度+|;
        }        TEMP =温度+联络资料;
    //}    返回温度;
}私有静态InputView getInputputViewByDisplayName(字符串显示名,名单,LT; InputView> inputViewList){
    对于(InputView inputView:inputViewList){
        如果(inputView.getDisplayName()。等于(显示名)){
            返回inputView;
        }
    }    返回null;
}
}

I have built an android app. It will get all contacts (1000 contact) from default address book (of my phone). And then, I show all of them on list view (of my app). BUT, I spend about 13s to load and display on list view. In my code below, I used 3 commands to query: Name, Phone Number and Company of each contact. I think this is the reason why my app which spend too much time to load and display data on listview.

I have 2 questions:

  1. How to get all information of an contact in android by using only 1 SQLite command?
  2. Is there any ways to load and display data onto listview faster???

This is code to query: name, phone no, company of a contact. The result of the query will be stored into a cursor. And then I use the cursor to set 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());
     } 
}

解决方案

I don't think so you can, or it should be something complicated.

Before fetch any info i need validate if Name exists at least.

Here is code I used:

 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;
}
}

这篇关于如何只用1 SQLite的命令来获得一个机器人接触的所有信息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆