路径:data/data/com.android.providers.contacts/databases/contact2.db
raw_contacts表 存放联系人的id,一个联系人对应一个id
data表 raw_contact_id外键 mimetype_id是类型 外键,邮箱,地址,电话 存放联系人的数据,
数据存放data1列, 数据类型 mimetype_id 数据属于哪个联系人 raw_contact_id
mimetypes表 定义的数据的类型 5电话 7姓名 1邮箱
如何查询联系人?
1.查询raw_contacts表 获取所有的联系人的id
2.根据联系人的id查询data表 里面data1的数据
查询 数据类型 电话 邮箱 姓名
3.根据mimetype获取数据的类型。
内容提供者 系统联系人的源代码
JB\packages\providers\ContactsProvider 清单文件
主机名 android:authorities="contacts;com.android.contacts",分号隔开,意思是2个都可以,2.1之前是前一个,后来觉着名称可能重复,2.1之后就改成后面的了
如果想兼容的版本比较好一些,用前面的
ContactsProvider2.java里面
找UriMatcher uri的匹配路径
查询的是 视图 view_raw_contacts view_data
如果想看是查询的哪个表,可以把 getContentResolver().query(dataUri, new String[]{"data1","mimetype"}, "raw_contact_id=?", new String[]{id}, "id");最后一个参数故意写错会在日志中显示sql语句
java代码
public void readContact(View view){ //利用内容提供者获取联系人的数据库 Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri=Uri.parse("content://com.android.contacts/data"); //1.查询row_content表里面所有联系人的id Cursor cursor = getContentResolver().query(uri, new String[]{"contact_id"}, null, null, "_id desc"); StringBuilder sb=new StringBuilder(); while (cursor.moveToNext()) { String id = cursor.getString(0); //判断这个联系人是否被删除 if(TextUtils.isEmpty(id))continue; System.out.println(id); //2.根据联系人查询data表里面的数据 Cursor datacursor = getContentResolver().query(dataUri, /*new String[]{"data1","mimetype"}*/null, "contact_id=?", new String[]{id}, null); while (datacursor.moveToNext()) { String data1 = datacursor.getString(datacursor.getColumnIndex("data1")); String mimetype = datacursor.getString(datacursor.getColumnIndex("mimetype")); if("vnd.android.cursor.item/phone_v2".equals(mimetype)){ sb.append("电话:"+data1); }else if("vnd.android.cursor.item/email_v2".equals(mimetype)){ sb.append("邮箱:"+data1); }else if("vnd.android.cursor.item/name".equals(mimetype)){ sb.append("姓名:"+data1); } } sb.append("---------------------------\n"); datacursor.close(); } cursor.close(); tv_show.setText(sb.toString()); }
如何添加一个联系人?
1.向raw_contact表添加一个联系人的id
2.分别向data表里面 添加联系人的电话 邮箱 姓名
java代码
public void addContact(View view){ //添加联系人信息 EditText et_name = (EditText) findViewById(R.id.et_name); EditText et_phone = (EditText) findViewById(R.id.et_phone); EditText et_email = (EditText) findViewById(R.id.et_email); //利用内容提供者获取联系人的数据库 Uri uri=Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri=Uri.parse("content://com.android.contacts/data"); //1.添加raw_contact表一个联系人的id //新的联系人的id=查询最后一个联系人的id+1; Cursor cursor = getContentResolver().query(uri, new String[]{"_id"}, null, null, null); cursor.moveToLast(); int lastid=cursor.getInt(0); int id=lastid+1; ContentValues values=new ContentValues(); values.put("contact_id", id); getContentResolver().insert(uri, values); //2.向data表添加数据 姓名 ContentValues datavalues=new ContentValues(); datavalues.put("raw_contact_id", id); datavalues.put("mimetype", "vnd.android.cursor.item/name"); datavalues.put("data1", et_name.getText().toString()); getContentResolver().insert(dataUri, datavalues); // 邮箱 ContentValues emailalues=new ContentValues(); emailalues.put("raw_contact_id", id); emailalues.put("mimetype", "vnd.android.cursor.item/email_v2"); emailalues.put("data1", et_email.getText().toString()); getContentResolver().insert(dataUri, emailalues); }