在Android中插入联系人

时间:2013-02-08 00:02:13

标签: android contacts contactscontract

我正在开发Android的备份应用程序,主要是联系人和短信。备份不是问题,但将联系人写回Android数据库证明是有问题的。

这是我到目前为止所做的:

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

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID, 1) 
    .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 
    .withValue(StructuredName.GIVEN_NAME, "Joe") 
    .withValue(StructuredName.FAMILY_NAME, "Bloggs") 
    .build()); 

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI)
    .withValueBackReference(Data.RAW_CONTACT_ID,1)
    .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "086555555")
    .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
    .build());

try{ 
    ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

这一切似乎都取决于RAW_CONTACT_ID。我正在使用模拟器,一开始没有联系人。它适用于第一次创建联系人(RAW_CONTACT_ID = 0),但似乎没有在该初始联系人之后创建联系人,其中RAW_CONTACT_ID为1以上。有人对这是怎么回事吗?

1 个答案:

答案 0 :(得分:1)

我所做的是先创建我的联系人,然后抓取新创建的联系人的ID,并将所有其他联系方式添加到该ID

这是我的第一步,创建新联系人,然后找到该联系人的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());
        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.PREFIX, prefix)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.SUFFIX, suffix)
                .build());

        resolver.applyBatch(ContactsContract.AUTHORITY, ops);

        Cursor cursor = null;
        try
        {
            cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, baseProjection, ContactsContract.Contacts.DISPLAY_NAME + " = ? ", new String[] {displayname}, __DEFAULT_SORT_ORDER);

            if (cursor.moveToFirst())
            {
                String val;
                val = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                return val;
            }
        }
...

然后我向我想要的联系人添加任何细节:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
                ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValue(ContactsContract.Data.CONTACT_ID, contactId)
                        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.Data.DATA5, poBox)
                        .withValue(ContactsContract.Data.DATA4, street)
                        .withValue(ContactsContract.Data.DATA7, city)
                        .withValue(ContactsContract.Data.DATA8, region)
                        .withValue(ContactsContract.Data.DATA9, postCode)
                        .withValue(ContactsContract.Data.DATA10, country)
                        .withValue(ContactsContract.Data.DATA2, type)
                        .withValue(ContactsContract.Data.DATA3, label)
                        .build());