Telephony Contact
1、联系人数据库表
accounts账户,包括SIM卡账户,本机账户,已经三方如google账户等。
contacts表
raw_contacts 表,联系人数据表,每一条数据表示一个联系人,联系人关键数据表格。
mimetypes表,数据类型,表示相关数据类型。
data表,联系人相关数据表。
data表,mimetypes表,raw_contacts之间的关联如下
2、联系人数据库调试
1、导出联系人数据库分析
adb shell am start -a com.android.providers.contacts.DUMP_DATABASE
2、然后打开provider log:
//contacts provider log(无需重启)
adb shell setenforce 0
adb shell setprop log.tag.ContactsProvider VERBOSE
adb shell setprop log.tag.ContactsDatabaseHelper VERBOSE
adb shell setprop log.tag.ContactAggregator VERBOSE
adb shell setprop log.tag.ContactsStrictMode VERBOSE
adb shell setprop log.tag.CallLogProvider VERBOSE
adb shell setprop log.tag.SQLiteTime VERBOSE
adb shell setprop log.tag.SQLiteLog VERBOSE
adb shell setprop log.tag.SQLiteStatements VERBOSE
adb shell setprop log.tag.SQLiteDatabase VERBOSE
adb shell setprop log.tag.SQLiteDatabaseTrace VERBOSE
adb shell setprop log.tag.SQLiteConnection VERBOSE
adb shell setprop log.tag.SQLiteConnectionPool VERBOSE
adb shell killall android.process.acore
adb shell pkill android.process.acore
//验证contacts provider log 是否开启
adb shell getprop log.tag.ContactsProvider
-> VERBOSE 为开启成功。
若contacts provider log 未开启成功请将adb 命令逐条执行,不要全部粘贴。
//并执行以下命令 copy 复现操作前后的联系人数据库
adb root
adb pull /data/data/com.android.providers.contacts/databases D:\data
3、联系人增删改查
public static void addContact(Context context, String name, String phoneNumber) {
ContentResolver contentResolver = context.getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues values = new ContentValues();
long contact_id = ContentUris.parseId(contentResolver.insert(uri, values));
uri = Uri.parse("content://com.android.contacts/data");
//add Name
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE,"vnd.android.cursor.item/name");
values.put("data1", name);
contentResolver.insert(uri, values);
values.clear();
//add Phone
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE,"vnd.android.cursor.item/phone_v2");
values.put("data1", phoneNumber);
contentResolver.insert(uri, values);
values.clear();
}
public void deleteContacts(String name) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = this.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID},"display_name=?", new String[]{name}, null);
if(cursor.moveToFirst()){
int id = cursor.getInt(0);
resolver.delete(uri, "display_name=?", new String[]{name});
uri = Uri.parse("content://com.android.contacts/data");
resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
}
cursor.close();
}
public void updateContacts(String name, String number) {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri uri2 = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = this.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID},"display_name=?", new String[]{name}, null);
if(cursor.moveToFirst()) {
int id = cursor.getInt(0);
ContentValues values = new ContentValues();
values.put("data1", number);
resolver.update(uri2, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2", id + ""});
}
cursor.close();
}
private void queryContacts() {
ContentResolver contentResolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
Cursor cursor = contentResolver.query(uri,null,null,null,null);
List<String> arrData = new ArrayList<>();
while (cursor.moveToNext()){
String name= cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
arrData.add("姓名:"+name+"---"+number);
}
cursor.close();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,R.layout.list_item, arrData);
mListView.setAdapter(arrayAdapter);
}
参考 Android入门之增删改查通讯录 - 唔愛吃蘋果 - 博客园