以获取和添加联系人为例,学习调用系统提供的ContentProvider
安卓系统在做联系人这个APP的时候,就已经提供好了一个联系人的ContentProvider。
包括3个表
1.raw_contacts表
Contact_id存放联系人的id
该表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
2.data表
这个表用来储存所有的联系人的详细信息的
一个联系人的信息可能存在多条数据,其中比较重要的字段是数据类型,联系人id,还有数据内容,
其中有一个字段mime_type是数据类型(电话,邮箱,名字)
3.mimeType表
就是联系人所有的数据库类型选项
代码部分,布局未列出。
package com.user.android2_lesson_06_systemcontentprivider;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
/**
* 调用系统提供的ContentPrivider
* 今天以获取联系人为例
* 系统在写联系人这个app的时候,就已经提供好了一个联系人的ContentPrivider
* 看一下系统提供的联系人数据库
* 源码里面都有。我们看一下截图
* raw_contacts表
* contact_id存放联系人的id
*
* data表这个表示用来存储所有联系人的详细信息。
* 一个联系人的信息可能分为多条数据,
* 其中比较重要的字段是数据类型,联系人id,还有数据内容
* 其中有一个字段mime_type是数据的类型(电话、邮箱、名字等)
* mime_type表
* 联系人所有的数据类型选项
*
* 看源码可以看出contentPrivider有两个Uri,两个都是可以用的
* 但是在4.0之后只能使用分号后面的Uri,该路径是向低版本兼容的
*
* 如果要获取联系人的数据,该怎么做?
* 1.获取所有的联系人的id
* 2.根据id查询到这个联系人的所有的数据消息
*
*/
public class MainActivity extends AppCompatActivity {
private Button mGetContacts;
private Button mUpdataContacts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGetContacts = (Button) findViewById(R.id.getContacts);
mUpdataContacts = (Button) findViewById(R.id.updataContacts);
mGetContacts.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;
}
// 2.根据id,获取到每一个联系人的所有信息
while(cursorID.moveToNext()){
// 拿到id的字符串
String contactid = cursorID.getString(cursorID.getColumnIndex("contact_id"));
// 根据id去data数据库里查询联系人的所有信息
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".equals(mimeType)){
Log.i("名字",data1);
}
}
// 关闭游标对象释放内存
contactData.close();
}
// 关闭游标对象释放内存
cursorID.close();
// 3.添加权限,允许读取ContentPrivider
}
});
// 通过上面分析,我们想要插入联系人,就需要如下的操作:
// 1、先去 raw_contacts 表中添加 id;
// 2、然后借助 id 去 data 表中添加各种信息。
mUpdataContacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ContentResolver cr2 = getContentResolver();
//先查询 raw_contacts 表,获取最新联系人的主键,然后主键+1,就是要插入的联系人的 id
Cursor cursorId = cr2.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);
cr2.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);
cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
//清空 ContentValues 插入电话
values.clear();
values.put("data1", "110119120");
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("raw_contact_id", contact_id); cr2.insert(Uri.parse("content://com.android.contacts/data"), values);
cursorId.close();
Toast.makeText(getApplicationContext(),"插入数据成功",Toast.LENGTH_SHORT).show();
}
});
}
}
这里注意需要添加读写权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
时间: 2024-11-01 01:23:04