Android ContactContracts 添加联系人的疑惑

来源:互联网 发布:excel求和数据不对 编辑:程序博客网 时间:2024/05/17 12:21

 1.以下面的方式添加联系人,添加多条DISPLAY_NAME相同的联系人时,会合并显示成一条,并且在编辑的的时候会有异常。

ContentValues values=new ContentValues();

 Uri uri=this.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);

 long rawContactId=ContentUris.parseId(uri);

 values.put(Data.RAW_CONTACT_ID, rawContactId);

  values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);

 values.put(StructuredName.DISPLAY_NAME, "test");

getContentResolver().insert(Data.CONTENT_URI, values);

2.四条DISPLAY_NAME为test的联系人,在Android2.2模拟的通讯录里显示成一条记录


3.编辑该条记录时,会出现以下异常


4.异常的详细信息如下:


5.用sqlite查看表contacts、raw_contacts、data的数据如下:

contacts表


raw_contacts表


data表



疑问:raw_contacts中的四条记录是如何合并成一条的?合并成一条后,为什么编辑时会出现以上的那些异常信息?


6.以官方例子ContactManager 所用的方式来添加联系人,则在通讯录中DISPLAY_NAME没有显示。

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .build());
        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, "test")
                .build());
        // Ask the Contact provider to create a new contact

        try {
            getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (Exception e) {
       
           // Log exception
            Log.e(TAG, "Exceptoin encoutered while inserting contact: " + e);
        }


对比官方ContactManager这个例子,它多了一下两句。

.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType())
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName())

问题:Account与DISPLAY_NAME为空有什么关系?