数据库                                                                                        

读联系人

  • 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. JAVA编程思想读书笔记(五)--多线程

    接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...

  2. 洛谷P1528 切蛋糕 [搜索,二分答案]

    题目传送门 切蛋糕 题目描述 Facer今天买了n块蛋糕,不料被信息组中球球等好吃懒做的家伙发现了,没办法,只好浪费一点来填他们的嘴巴.他答应给每个人留一口,然后量了量每个人口的大小.Facer有把刀 ...

  3. [转]SharePoint 2010 Powershell Feature Cmdlets

    In this installment its time to look at the various cmdlets that have to do with Features. Of course ...

  4. 前端使用express mock数据

    项目中使用的是RESTFUL接口规范,项目框架用的是vue,项目开始时,调研了几个比较有名的mock数据的插件:比如webpack的中间件api-mock,json-server,mockjs,还有e ...

  5. Java反射机制demo(二)—通过Class实例化任意类的对象

    Java反射机制demo(二)—通过Class实例化任意类的对象 上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例. 任意一个类 ...

  6. Bzoj3261/洛谷P4735 最大异或和(可持久化Trie)

    题面 Bzoj 洛谷 题解 显然,如果让你查询整个数列的最大异或和,建一颗\(01Trie\),每给定一个\(p\),按照二进制后反方向跳就行了(比如当前二进制位为\(1\),则往\(0\)跳,反之亦 ...

  7. [CSAcademy]Exponential Game

    题目大意: 有n堆石子,A和B两人轮流进行操作: 取走任意一堆石子,若这堆石子的个数是x个,那么可以放入x-1堆数量为0~x-1的石子. 不能操作者负. 思路: 将每一堆石子作为一个子游戏,将石子的数 ...

  8. Yolov_3 网络结构分析

    转自:https://blog.csdn.net/KKKSQJ/article/details/83587138 original Based on keras-yolov3, understandi ...

  9. bzoj 3165

    题意: 给出平面上一些线段,在线询问与x=x0相交的线段中,交点y最大的线段的标号,支持添加线段. 大概思路: 用线段树维护,线段树每个线段记录贯穿(左右端点在该区间外或上)的原线段中能覆盖其它贯穿该 ...

  10. 使用本地的Nuget Repository加速Nuget访问速度

    Nuget是一个在VisualStudio下的非常好用的包管理器,然而由于众所周知的原因,其访问速度非常令人抓狂,甚至抽风.在没有VPN的环境下,如何解决这一问题呢?常见的解决方案是自己搭建一个Nug ...