以获取和添加联系人为例学习调用系统ContentPrivider
2016-07-11 21:26
477 查看
以获取和添加联系人为例,学习调用系统提供的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表
就是联系人所有的数据库类型选项
代码部分,布局未列出。
安卓系统在做联系人这个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"/>
相关文章推荐
- thinkphp项目 出现 Internal Server Error 错误原因分析
- PHP开发环境软件安装
- PHP的压力测试工具ab.exe 和mpm介绍提高并发数
- php基础复习一语法基础
- ThinkPHP框架表单验证
- PHP Mail() 函数最终解决办法
- php必备技能 转载
- ThinkPHP中initialize和construct的不同
- Open Flash Chart在php中的使用教程
- yii2 验证码的使用
- php定界符<<<EOF讲解
- 分享一个PHP调用RestFul接口的函数
- php 读取和下载execl
- php 实现猴子选大王递归算法
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep
- thinkPHP学习_第一天
- 访问路径把index.php省略掉
- yii高级框架默认访问控制器方法
- yii 原生语句 增删改查
- php原生导出excel文件的两种方法