Tôi đang làm việc trên Bài kiểm tra đơn vị cho ứng dụng Android của mình và đang làm rất nhiều việc với Danh sách liên hệ. Tôi phải chèn liên hệ vào Nhà cung cấp nội dung Android và xóa chúng sau khi chạy thử nghiệm của mình. Vấn đề là, họ không được thực sự bị xóa:Xóa (Địa chỉ liên hệ thô) trong Android 2.x
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();
}
phương pháp xóa 1 (trả về số danh bạ liệu, nhưng họ không thực sự được xóa):
int deletedRawContacts = context.getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"});
Phương pháp xóa 2 (cùng một kết quả như phương pháp xóa 1, nhưng cách tiếp cận khác):
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;
}
Phương thức xóa cho Danh bạ hoạt động, nhưng phương pháp xóa cho Liên hệ thô sẽ trả về giá trị sai. Nó sẽ "thông báo" cho tôi, rằng nó đã xóa tất cả các liên hệ, nhưng khi tôi chạy trường hợp thử nghiệm tiếp theo, vẫn có thể tìm thấy Danh sách liên hệ thô cũ (nghĩa là số lượng địa chỉ liên hệ được chèn so với địa chỉ liên hệ hiện tại không đúng). Lưu ý: Tất cả thử nghiệm được thực hiện trên trình giả lập Android.
Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?
Tôi thấy một câu hỏi tương tự ở đây: How to delete a contact? - nhưng giải pháp dường như không giải quyết được vấn đề nhất định.
L0rdAli3n, bạn chỉ cần kiếm được một số nghiệp tốt để giúp một người đàn ông tuyệt vọng :) –
Tôi rất vui vì tôi có thể giúp :) –
Tôi chỉ nhận ra tôi quên để đánh dấu câu trả lời này đúng - muộn hơn không bao giờ @ChristophHaefner? – benfwirtz