问题描述
我工作的单元测试,我的Android应用程序,和我做了很多与我们联系。我要插入联系人到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这样的:
<$p$p><$c$c>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 +。&GT; =,新的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 :)
这篇关于删除(RAW)联系人中的Android 2.X的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!