删除(RAW)联系人中的Andr​​oid 2.X人中、RAW、Andr、oid

2023-09-05 01:56:01 作者:朂酷⑶suι半

我工作的单元测试,我的Andr​​oid应用程序,和我做了很多与我们联系。我要插入联系人到Android的内容提供商,并运行我的测试后,将其删除。麻烦的是,他们没有得到实际删除:

插入:

 的ArrayList< ContentProviderOperation> contactOps =新的ArrayList< ContentProviderOperation>();

INT backRefIndex = 0;

随机R =新的随机();

    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                                           .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,空)
                                           .withValue(ContactsContract.RawContacts.ACCOUNT_NAME,空)
                                           。建立());
    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,样品名称+ r.nextInt())
                                           。建立());

    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)
                       。建立());

    尝试 {
        ContentProviderResult []结果= context.getContentResolver()applyBatch(ContactsContract.AUTHORITY,contactOps)。
    }赶上(例外五){
        e.printStackTrace();
    }
 

删除方法1(返回原始的联系号码,但他们并没有真正被删除):

  INT deletedRawContacts = context.getContentResolver()删除(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts._ID +> =?,新的String [] {0 });
 

删除方法2(相同的结果,删除方法1,但不同的方法):

 私有静态诠释deleteAllRawContacts(上下文的背景下){
    ContentResolver的CR = context.getContentResolver();
    光标CUR = cr.query(ContactsContract.RawContacts.CONTENT_URI,NULL,NULL,NULL,NULL);
    诠释计数= 0;
    而(cur.moveToNext()){
        尝试 {
            字符串的ContactID = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID));
                数+ = cr.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts._ID +=?,新的String [] {}的ContactID);
        }赶上(例外五){
            的System.out.println(e.getStackTrace());
        }
    }
    返回计数;
}
 

的删除方法与我们联系工作,但删除方法原始联系人将返回错误的值。它会告诉我,它删除了所有的联系人,但是当我跑我的下一个测试案例,旧生联系人仍然可以发现(插入通讯录与present接触即数是错误的)。注:所有测试均在Android模拟器完成

任何想法如何解决这个问题?

我看到了类似的问题在这里:如何删除接触了Android 2.1 - 但解决方案似乎没有解决给定的问题,无论是

解决方案

由于wiseideal已经提到您删除rawcontacts将只设置了已删除-flag为1的方式。

您需要做的是将caller_is_syncadapter标志在你的URI设置为true这样的:

RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, 真)。建()

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

  INT deletedRawContacts = context.getContentResolver().delete(RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, 真)建(),ContactsContract.RawContacts._ID +。> =,新的String [] {0});
 

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

希望这有助于快乐编码:)

I am working on Unit Tests for my Android app, and am doing a lot with Contacts. I have to insert contacts into the Android Content Providers, and delete them after running my tests. Trouble is, they do not get actually deleted:

Insertion:

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

Deletion method 1 (returns number of raw contacts, but they do not actually get deleted):

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

Deletion method 2 (same result as deletion method 1, but different approach):

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;
}

The deletion method for Contacts works, but the deletion method for Raw Contacts will return a false value. It will "tell" me, that it deleted all contacts, but when I run my next test case, the old Raw Contacts can still be found (i.e. the count of inserted contacts vs. present contacts is wrong). Note: All testing is done on the Android emulator.

Any ideas how to solve this?

I saw a similar question here: how to delete a contact in android 2.1 - but the solution does not seem to solve the given problem either.

解决方案

As wiseideal already mentioned the way you delete your rawcontacts will only set the "deleted"-flag to 1.

What you need to do is to set the caller_is_syncadapter-flag in your URI to true like this:

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

And then use this new URI to call the delete-method:

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

The corresponding part in the documentation is here (Operations->delete).

Hope this helps and happy coding :)

 
精彩推荐