数据库                                                                                        

读联系人

  • raw_contacts表:保存联系人的id      contact_id保存联系人的id
  • data表:保存联系人的数据    data1存放数据    mimetype_id存放数据类型   raw_contact_id存放数据属于哪一个联系人的
  • mimetypes表:保存数据的类型  1 –> email  5 –>phone  7 –>name

流程:

1.查询raw_contact表,把所有的联系人的id取出来。

2.根据id查询data表,把这个id对应的所有的数据取出来。

3.根据数据的类型 查询mimetypes表获取数据业务的类型。

写联系人

1.在raw_contact表中添加一个id。

2.使用这个新添加的id在data表里面添加对应的数据。

读取                                                                                          

public class MainActivity extends Activity {

    private Button btn_read;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btn_read = (Button) findViewById(R.id.btn_read);
btn_read.setOnClickListener(new buttonLisnter());
} class buttonLisnter implements OnClickListener { @Override
public void onClick(View v) {
// 查询raw_contact表获取联系人ID
ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data"); Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(cursor
.getColumnIndex("contact_id"));
System.out.println("id====" + id);
Cursor dataCursor = resolver.query(datauri, null,
"raw_contact_id=?", new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
String mimetype = dataCursor.getString(dataCursor
.getColumnIndex("mimetype"));
System.out.println("data1=" + data1
+ "--------------mimetype=" + mimetype);
}
dataCursor.close();
System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
}
cursor.close();
} } }

写入                                                                                          

case R.id.btn_write:
// 向raw_contact表里调价联系人的id
ContentResolver reslo = getContentResolver();
// 获取raw_contact对应的uri
Uri uri1 = Uri
.parse("content://com.android.contacts/raw_contacts");
Uri datauri1 = Uri.parse("content://com.android.contacts/data");
ContentValues values = new ContentValues();
Cursor cursor1 = reslo.query(uri1, new String[] { "_id" },
null, null, null);
cursor1.moveToNext();
int lastId = cursor1.getInt(0);
int newId = lastId + 1;
values.put("_id", newId);
reslo.insert(uri1, values);
// 添加data1
ContentValues phoneValues = new ContentValues();
phoneValues.put("data1", "88888888888");
phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
phoneValues.put("raw_contact_id", newId);
reslo.insert(datauri1, phoneValues); ContentValues emailValues = new ContentValues();
emailValues.put("data1", "admin@yyd.com");
emailValues.put("mimetype", "vnd.android.cursor.item/email_v2");
emailValues.put("raw_contact_id", newId);
reslo.insert(datauri1, emailValues); ContentValues nameValues = new ContentValues();
nameValues.put("data1", "admin@yyd.com");
nameValues.put("mimetype", "vnd.android.cursor.item/name");
nameValues.put("raw_contact_id", newId);
reslo.insert(datauri1, nameValues); Toast.makeText(MainActivity.this, "插入OK", Toast.LENGTH_LONG)
.show(); break;

注意                                                                                           

当联系人被删除之后,其实联系人还是存在在数据库里面的,但是只是”contact_id”为null了,所以为了不取出用户已经删除的联系人,读取到的”contact_id”需要判断一下是否为null。

我是天王盖地虎的分割线                                                                 

源代码:http://pan.baidu.com/s/1dD1Qx01

读取联系人.zip

转载请注明出处:http://www.cnblogs.com/yydcdut

Android -- ContentProvider与联系人的更多相关文章

  1. Android ContentProvider基本用法

    转自:https://www.jianshu.com/p/601086916c8f 一.基本概念 ContentProvider是Android系统中提供的专门用户不同应用间进行数据共享的组件,提供了 ...

  2. Android基础 : Android ContentProvider

    Android 应用程序通过ContentProvider实现方式统一的数据共享功能. 外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activi ...

  3. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

  4. Android Phonebook编写联系人UI加载及联系人保存流程(一)

    2014-01-06 17:05:11 将百度空间里的东西移过来. 本文适合ROM定制做Phonebook的童鞋看,其他人飘过即可- Phonebook添加/编辑联系人UI加载及保存联系人流程,是一系 ...

  5. Android ContentProvider完整案例

    ContentData类,提供数据常量: /** * 提供ContentProvider对外的各种常量,当外部数据需要访问的时候,就可以参考这些常量操作数据. * @author HB * */ pu ...

  6. Android——ContentProvider

    xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  7. Android ContentProvider 启动分析

    对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...

  8. android中ContentProvider获取联系人 总结

    35.内容提供者:ContentResolver 用内容提供者来获取联系人信息 35-1:权限 <!-- 对联系人的读.写权限 --> <uses-permission androi ...

  9. Android -- ContentProvider, 读取和保存系统 联系人

    1. 示例代码 需要的读写联系人的权限 <uses-permission android:name="android.permission.WRITE_CONTACTS"/& ...

随机推荐

  1. Cordova - 禁用整个应用页面的上下拖动效果(防止拖动出现黑边)

    可在 config.xml 中进行如下设置:   <preference name="WebViewBounce" value="false" /> ...

  2. 转:使用python的Flask实现一个RESTful API服务器端

    提示:可以学习一下flask框架中对于密码进行校验的部分.封装了太多操作. 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了 ...

  3. Python类总结-字段,方法,属性区别及StaticMethod, Property,私有字段和私有属性

    类包含下列 静态属性 动态属性 静态方法 动态方法 class Province: #静态字段--属于类,调用方法类.字段名 memo = "中国23个省之一" #动态字段--属于 ...

  4. Request.QueryString与Request的区别

    Request.Form可以获取表单中提交的内容,对于单选则会自定进行判断获取选中的值. Request.QueryString["id"] 只能读取通过地址栏参数传递过来的名为i ...

  5. shell top解析

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不 ...

  6. zTree通过指定ID找到节点并选中

    zTree = $.fn.zTree.getZTreeObj("treeDemo");//treeDemo界面中加载ztree的div var node = zTree.getNo ...

  7. [BOI2004]Sequence

    题面描述 给定整数数组$a_1,a_2,a_3...a_n$,求递增数组$b_1,b_2,b_3...b_n$ 使得$|a_1 - b_1| + |a_2 - b_2| + ... + |a_n - ...

  8. 是否排序好了 Exercise07_19

    import java.util.Scanner; import java.util.Arrays; /** * @author 冰樱梦 * 时间2018年12月 * 题目:是否排序好了 * */ p ...

  9. 【洛谷】2990:[USACO10OPEN]牛跳房子Cow Hopscotch【单调队列优化DP】

    P2990 [USACO10OPEN]牛跳房子Cow Hopscotch 题目描述 The cows have reverted to their childhood and are playing ...

  10. spoj 375 query on a tree LCT

    这道题是树链剖分的裸题,正在学LCT,用LCT写了,发现LCT代码比树链剖分还短点(但我的LCT跑极限数据用的时间大概是kuangbin大神的树链剖分的1.6倍,所以在spoj上是850ms卡过的). ...