0

我正在为 Android 开发一个备份应用程序,主要是联系人和 SMS 消息。备份不是问题,但将联系人写回 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 向上。有人对这种情况有任何想法吗?

4

1 回答 1

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());
于 2013-02-22T00:59:47.697 回答