2013-08-01 2 views
2

나는 안드로이드 앱을 만들었습니다. 모든 연락처 (1000 연락처) 기본 주소록 (내 전화)에서 얻을 것이다. 그런 다음 목록보기 (내 앱)에 모든 항목을 표시합니다. 하지만 목록보기에로드하고 표시하는 데 약 13 초를 소비합니다. 아래 코드에서 이름, 전화 번호 및 각 연락처의 회사를 쿼리하는 데 3 가지 명령을 사용했습니다. 이것이 왜 내가 목록보기에 데이터를로드하고 표시하는 데 너무 많은 시간을 소비하는 이유 인 이유라고 생각합니다.한 SQLite 명령을 사용하여 android 연락처의 모든 정보를 얻는 방법?

  1. 방법 만 1 SQLite는 명령을 사용하여 안드로이드의 모든 연락처 정보를 얻을 수 :

    나는이 개 질문이?

  2. 로드 및 데이터를 더 빨리 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()); 
    } 
} 

답변

1

나는 그렇게 생각하지 않는다. 또는 뭔가 복잡해야한다.

정보를 가져 오기 전에 Name이 존재하는지 확인해야합니다. 여기

내가 사용하는 코드입니다 : 첫 번째 부분을 사용

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

, 그것은 완벽하게 작동합니다. 정답으로 표시해야합니다. 많은 thx. 그런 와우! – luQ

관련 문제