gpt4 book ai didi

android - 在 Android 2.x 中删除(原始)联系人

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:11:29 26 4
gpt4 key购买 nike

我正在为我的 Android 应用程序进行单元测试,并且在通讯录方面做了很多工作。我必须将联系人插入 Android 内容提供程序,并在运行测试后删除它们。问题是,它们实际上并没有被删除:

插入:

ArrayList<ContentProviderOperation> contactOps = new ArrayList<ContentProviderOperation>();

int backRefIndex = 0;

Random r = new Random();

contactOps.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Sample Name" + r.nextInt())
.build());

contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex)
.withValue(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "020" + r.nextInt())
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, r.nextInt(20)
.build());

try {
ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, contactOps);
} catch (Exception e) {
e.printStackTrace();
}

删除方法一(返回原始联系人数量,但实际上并没有被删除):

int deletedRawContacts = context.getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"});

删除方法二(与删除方法一结果相同,但处理方式不同):

private static int deleteAllRawContacts(Context context) {
ContentResolver cr = context.getContentResolver();
Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null);
int count = 0;
while (cur.moveToNext()) {
try {
String contactId = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID));
count += cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " = ?", new String[]{contactId});
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
return count;
}

Contacts 的删除方法有效,但是Raw Contacts 的删除方法会返回一个false 值。它会“告诉”我,它删除了所有联系人,但是当我运行下一个测试用例时,仍然可以找到旧的原始联系人(即插入的联系人与当前联系人的数量是错误的)。注意:所有测试均在 Android 模拟器上完成。

有什么解决办法吗?

我在这里看到了一个类似的问题:How to delete a contact? - 但解决方案似乎也没有解决给定的问题。

最佳答案

正如 wiseideal 已经提到的,删除原始联系人的方式只会将“已删除”标志设置为 1。

您需要做的是像这样将 URI 中的 caller_is_syncadapter-flag 设置为 true:

RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build()

然后使用这个新的 URI 调用删除方法:

int deletedRawContacts = context.getContentResolver().delete(RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"});

文档中对应的部分是here (操作->删除)。

希望这对您有所帮助并祝您编码愉快:)

关于android - 在 Android 2.x 中删除(原始)联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7351444/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com