调用系统提供的ContentProvider
系统在写联系人这个APP的时候,就已经提供好了一个联系人的数据库和ContentProvider。
包括1.raw_contacts表
Contact_id存放联系人的id
该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,
从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添
加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
2.contacts表
该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加
到收藏夹等信息。
3.data表
这个表用来储存所有的联系人的详细信息的
一个联系人的信息可能存在多条数据,其中比较重要的字段是数据类型,联系人id,还有数据内容,
其中有一个字段mime_type是数据类型(电话,邮箱,名字)
4.mimeType表
就是联系人所有的数据库类型选项
看源码可以看出ContentProvider有两个Uri,两个都可以用的,但是在4.0之后,只能用分号后的Uri,该路径向低版本兼容。
若要获取联系人的id:1.获取所有人的根据id查询到这个联系人的所有的数据信息
下面是读取联系人的实例
当人,提前要在AndroidManifest中注册
android:name="android.permission.READ_CONTACTS"/>
再在MainActivity里
private Button getContscts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getContscts= (Button) findViewById(R.id.getContacts); getContscts.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //在这里进行联系人的获取 ContentResolver cr=getContentResolver(); //1.获取所有的联系人id Cursor cursorID=cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"},null,null,null); if (cursorID.getCount()==0){ Toast.makeText(MainActivity.this,"没有联系人",Toast.LENGTH_SHORT).show(); return; } //根据ID获取到每一个联系人的所有信息 while(cursorID.moveToNext()){ // 拿到id的字符串 String contactid=cursorID.getString(cursorID.getColumnIndex("contact_id")); // 根据ID去data数据库里查询联系人的所有信息 "raw_contact_id=?":查询条件 new String[]{contactid}:找出的id Cursor contactData=cr.query(Uri.parse("content://com.android.contacts/data"),new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contactid},null); // 遍历获取联系人的信息 while(contactData.moveToNext()){ // 拿到数据内容 String data1=contactData.getString(contactData.getColumnIndex("data1")); // 拿到数据类型 String mimeType=contactData.getString(contactData.getColumnIndex("mimetype")); if ("vnd.android.cursor.item/email_v2".equals(mimeType)){ Log.i("邮箱",data1); }else if ("vnd.android.cursor.item/phone_v2".equals(mimeType)){ Log.i("电话",data1); }else if ("vnd.android.cursor.item/name_v2".equals(mimeType)){ Log.i("名字",data1); } } // 关闭游标对象,关闭内存 contactData.close(); } // 关闭游标对象,关闭内存 cursorID.close(); // 添加权限,允许读取ContentProvider } }); } }
运行,查看Log
插入联系人:
首先注册写入权限
android:name="android.permission.WRITE_CONTACTS"/>
如上,我们想插入联系人,就需要如下的操作:
1.先去raw_contacts表中添加id;
2.然后借助id去data表中添加各种信息。
ContentResolver cr = getContentResolver(); //先查询raw_contacts表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的id Cursor cursorId = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"_id"},null,null,null); //默认联系人id就是1 int contact_id = 1; if(cursorId.moveToLast()){ //拿到主键 int _id = cursorId.getInt(cursorId.getColumnIndex("_id")); //主键+1,就是要插入的联系人 contact_id = ++_id; } //把 contact_id 添加到 raw_contacts 表中 ContentValues values = new ContentValues(); values.put("contact_id",contact_id); cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"),values); //清空 ContentValues 插入姓名 values.clear(); values.put("data1", "盗跖"); values.put("mimetype", "vnd.android.cursor.item/name"); values.put("raw_contact_id", contact_id); cr.insert(Uri.parse("content://com.android.contacts/data"), values); //清空 ContentValues 插入电话 values.clear(); values.put("data1", "888888888"); values.put("mimetype", "vnd.android.cursor.item/phone_v2"); values.put("raw_contact_id", contact_id); cr.insert(Uri.parse("content://com.android.contacts/data"), values); cursorId.close(); Toast.makeText(MainActivity.this,"插入数据成功",Toast.LENGTH_SHORT).show(); } });运行测试结果
1
1
1
1