2012-10-30 3 views
3

새 연락처를 만들 때 RAW_CONTACT_ID를 설정해야한다고 생각합니다. 이 코드가 어떻게 잘 수행되는지는 아닙니다. 내가 맞습니까? 그렇지 않은 경우,이 데이터가 동일한 연락처에 속한다는 것을 어떻게 알 수 있습니까? 예인 경우 RAW_CONTACT_ID를 설정하는 방법은 무엇입니까? 어쩌면 질문은 이렇게 말할 수 있습니다 : 어떻게 존재하지 않는 새로운 RAW_CONTACT_ID를 얻을 수 있습니까? 다음 (내가 RAW_CONTACT_ID에 0을 설정) 내 코드를 게시 :새 연락처를 만들 때 RAW_CONTACT_ID를 설정하는 방법

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()); 
    } 
    context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

답변

2

당신은 아래) INT rawContactInsertIndex = ops.size을 (사용해야합니다.

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
     int rawContactInsertIndex = ops.size(); 

     ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build()); 

     ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 
       .withValue(StructuredName.DISPLAY_NAME, personalVcard.getFirstName()).build()); 
+0

tks! – blackdog

0

나는 이전 버전의 Android에서 잘 작동했던 동일한 코드를 사용하여 JB에서 이상한 문제를 발견했다고 생각합니다. 동일한 기본 이름을 공유하는 연락처를 생성하라는 요청을 받으면 생성이 진행되지 않고 withValueBackReference (ContactsContract.Data.RAW_CONTACT_ID, 0)에 의해 반환 된 원시 연락처 ID가 동일하게 보입니다.

예를 들어, Contact1, Contact2 및 Contact3을 작성하십시오. 이상한 물건이 시작됩니다. 대부분 연락처를 볼 수 없지만 API를 사용하여 연락처를 삭제하려고하면 연락처가 실제로 있음을 알게됩니다.

그것이 내 Jelly Bean 플랫폼을 망가뜨린 결과인지 아니면 Android 빌드에서 일반적인 문제인지 확실하지 않습니다. 나는 개발중인 플랫폼에 대해 의견을 말하고 있습니다.

누구든지 이것을 4.1.2에서 보았습니까?

0

이 코드 블록은 연락처의 이름을 모바일 번호로 저장합니다.

private void saveContact() { 
    this.sessionpref.setPreference("Saved", "Done"); 
    ArrayList<ContentProviderOperation> ops = new ArrayList(); 
    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 
     .withValue("account_type", null).withValue("account_name", null).build()); 

    if (this.DisplayName != null) { 
    ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
     .withValueBackReference("raw_contact_id", 0) 
     .withValue("mimetype", "vnd.android.cursor.item/name") 
     .withValue("data1", this.DisplayName) 
     .build()); 
    } else { 
    Toast.makeText(getApplicationContext(), "Contact Exist", 3000).show(); 
    } 

    if (this.MobileNumber != null) { 
    ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
     .withValueBackReference("raw_contact_id", 0) 
     .withValue("mimetype", "vnd.android.cursor.item/phone_v2") 
     .withValue("data1", this.MobileNumber).withValue("data2", Integer.valueOf(2)) 
     .build()); 
    } else { 
    Toast.makeText(getApplicationContext(), "Contact Exist", 3000).show(); 
    } 
    try { 
    getContentResolver().applyBatch("com.android.contacts", ops); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 
관련 문제