在Android中插入联系人



我正在为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。有人知道这是怎么回事吗?

我所做的是首先创建我的联系人,然后获取新创建的联系人的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());

最新更新