Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查)

2014年2月21日 Android通讯录管理总结

这几天导师安排我一个任务就是研究一下Android通讯录获取联系人、通话记录、短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情。Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系。下面是本人查询资料总结的一下知识点,方便童鞋们以后用到。

http://xys289187120.blog.51cto.com/3361352/656766

Android联系人数据库文件(contact2.db)

有研究过手机通讯录数据的童鞋肯定知道一个数据库文件:目前是contact2.db(哥的手机是Android4.04的)

在此路径下可以找到:/data/data/com.android.providers.contacts/databases/contact2.db

将其导入可视化数据库管理器当中(我这里用的是SQLiteDatabase Browser)

有以上那么多张表,看到头晕的有木有,我们主要关注一些比较重要的表就行了。

以上我用红框标志的是比较重要的几个表:

1、contacts表

该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。

2、raw_contacts表

该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID: RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。

3、 mimetypes 表

该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。

4、data表

? 该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID: MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。

? 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。

通话记录表calls


字段名称


说明


_id


索引Key,自增长


number


通话电话号码


date


拨打该电话号码的开始时间(以1970-01-01 00:00:00)计算到当前的时间差以毫秒为单位


duration


打电话持续时间以秒为单位


type


拨打类型:1为接听 2为打出


new


好像都为1


name


未知


 

通讯录表contacts


字段名称


说明


_id


索引Key,自增长


name_raw_contact_id


当前联系人的id


photo_id


联系人图片id


custom_ringtone


为该联系人自定义铃声:content://media/external/audio/media/1


send_to_voicemain


直接将来电转到语音信箱:0为不设置;1为设置


times_contacted


通话次数


last_time_contacted


最后通话的日期(以1970-01-01 00:00:00)计算


starred


加星标的那些人:0为不加星;1为加星


in_visible_group


联系人在UI中是否可见:0为不可见;1为可见


has_phone_number


联系人是否至少有一个电话号码


lookup


不知


 

通讯录子表data


字段名称


说明


_id


索引Key,自增长


mimetype_id


当前行保存数据的类型:1为邮箱;2聊天账号;3住址;4图片;5电话号码;6姓名;7公司+职位;8昵称;9所属组;10备注;11网址


raw_contact_id


与contacts表中的name_raw_contact_id相同,该数据所属联系人


is_primary


0;1;


is_super_primary


0;1好像在联系人图片列中出现;


data_version


数据版本(更改次数)


data1


好像是基本数据类型存放在这一列


data2,data3


存放data2名字,data3姓氏,其它字段存放就不知


data4


存入电话号码倒写;职位;街道;其它不知


data5


若是聊天账号行则有数据,,其它不知


data7


若是住址行则有市数据;其它不知


data8


若是住址行则有省数据;其它不知


data9


若是住址行则有邮编数据;其它不知


data10,data11


若是姓名行则有数据;其它不知


data15


若是照片行则有数据;其它不知


其它data未知


不知

对联系人的基本操作(增删改查)

权限设置

<uses-permissionandroid:name="android.permission.write_contacts">

读取联系人

分为以下步骤:

1、先读取contacts表,获取ContactsID;

2、再在raw_contacts表中根据ContactsID获取RawContactsID;

3、然后就可以在data表中根据RawContactsID获取该联系人的各数据了。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

private void queryContacts() {

        // 获取用来操作数据的类的对象,对联系人的基本操作都是使用这个对象

        ContentResolver cr = getContentResolver();

        // 查询contacts表的所有记录

        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,

                null, null, null);

        // 如果记录不为空

        if (cursor.getCount() > 0) {

            // 游标初始指向查询结果的第一条记录的上方,执行moveToNext函数会判断

            // 下一条记录是否存在,如果存在,指向下一条记录。否则,返回false。

            while (cursor.moveToNext()) {

                String rawContactId = "";

                // 从Contacts表当中取得ContactId

                String id = cursor.getString(cursor

                        .getColumnIndex(ContactsContract.Contacts._ID));

                Log.v("contactID", id);

                // 获取RawContacts表的游标

                Cursor rawContactCur = cr.query(RawContacts.CONTENT_URI, null,

                        RawContacts._ID + "=?", new String[] { id }, null);

                // 该查询结果一般只返回一条记录,所以我们直接让游标指向第一条记录

                if (rawContactCur.moveToFirst()) {

                    // 读取第一条记录的RawContacts._ID列的值

                    rawContactId = rawContactCur.getString(rawContactCur

                            .getColumnIndex(RawContacts._ID));

                    Log.v("rawContactID", rawContactId);

                }

                // 关闭游标

                rawContactCur.close();

                // 读取号码

                if (Integer

                        .parseInt(cursor.getString(cursor

                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {

                    // 根据查询RAW_CONTACT_ID查询该联系人的号码

                    Cursor phoneCur = cr

                            .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                                    null,

                                    ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID

                                            + "=?",

                                    new String[] { rawContactId }, null);

                    // 上面的ContactsContract.CommonDataKinds.Phone.CONTENT_URI

                    // 可以用下面的phoneUri代替

                    // Uri

                    // phoneUri=Uri.parse("content://com.android.contacts/data/phones");

                    // 一个联系人可能有多个号码,需要遍历

                    while (phoneCur.moveToNext()) {

                        // 获取号码

                        String number = phoneCur

                                .getString(phoneCur

                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                        Log.v("number", number);

                        // 获取号码类型

                        String type = phoneCur

                                .getString(phoneCur

                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));

                        Log.v("type", type);

                    }

                    phoneCur.close();

                }

            }

            cursor.close();

        }

    }

新建联系人

新建联系人时, 根据contacts、raw_ contacts两张表中ID的使用情况,自动生成ContactID和RawContactID。

Android源码新建重复姓名的联系人的ContactID是不重复的,所以会重复显示。

用下面的代码新建联系人,如果多次新建的联系人的姓名是一样的,生成的ContactID也会重复, RawContactID不会重复,我们在读取联系人的时候可以获取所有同姓名联系人的号码等信息,在显示联系人的时候,重复姓名的联系人的所有字段信息都会合并起来显示为一个联系人。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public void addContact(String name, String phoneNum) {

        ContentValues values = new ContentValues();

        Uri rawContactUri = getContentResolver().insert(

                RawContacts.CONTENT_URI, values);

        long rawContactId = ContentUris.parseId(rawContactUri);

        // 向data表插入数据

        if (name != "") {

            values.clear();

            values.put(Data.RAW_CONTACT_ID, rawContactId);

            values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);

            values.put(StructuredName.GIVEN_NAME, name);

            getContentResolver().insert(ContactsContract.Data.CONTENT_URI,

                    values);

        }

        // 向data表插入电话号码

        if (phoneNum != "") {

            values.clear();

            values.put(Data.RAW_CONTACT_ID, rawContactId);

            values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

            values.put(Phone.NUMBER, phoneNum);

            values.put(Phone.TYPE, Phone.TYPE_MOBILE);

            getContentResolver().insert(ContactsContract.Data.CONTENT_URI,

                    values);

        }

    }

删除联系人

Android帮助文档:When a raw contact is deleted, all of its Data rows as well asStatusUpdates, AggregationExceptions, PhoneLookup rows are deleted automatically.

所以,要删除联系人,我们只需要将raw_contacts表中指定RawContactID的行删除,其他表中与之关联的数据都会自动删除。

?


1

2

3

4

5

6

// 删除联系人

    public void deleteContact(long rawContactId) {

        getContentResolver().delete(

                ContentUris.withAppendedId(RawContacts.CONTENT_URI,

                        rawContactId), null, null);

    }

更新联系人

联系人的所有信息都是保存在data表中,所以要更新联系人,我们只需要根据RawContactID和MIMETYPE修改data表中的内容。

?


1

2

3

4

5

6

7

8

9

10

11

12

// 更新联系人

    public void updataCotact(long rawContactId) {

        ContentValues values = new ContentValues();

        values.put(Phone.NUMBER, "13800138000");

        values.put(Phone.TYPE, Phone.TYPE_MOBILE);

        String where = ContactsContract.Data.RAW_CONTACT_ID + "=? AND "

                + ContactsContract.Data.MIMETYPE + "=?";

        String[] selectionArgs = new String[] { String.valueOf(rawContactId),

                Phone.CONTENT_ITEM_TYPE };

        getContentResolver().update(ContactsContract.Data.CONTENT_URI, values,

                where, selectionArgs);

    }

 

转载于:http://www.2cto.com/kf/201402/280583.html

时间: 2024-08-05 23:17:54

Android通讯录数据库介绍与基本操作(增删改查)的相关文章

Android中使用Sqlite数据库 (二) 增删改查

定义接口 package com.example.android_db.service; import java.util.List; import java.util.Map; public interface PersonService { public boolean addPerson(Object[] params); public boolean deletePerson(Object[] params); public boolean updatePerson(Object[] p

使用JDBC分别利用Statement和PreparedStatement来对MySQL数据库进行简单的增删改查以及SQL注入的原理

一.MySQL数据库的下载及安装 https://www.mysql.com/ 点击DOWNLOADS,拉到页面底部,找到MySQL Community(GPL)Downloads,点击 选择下图中的MySQL Community Server 选择想要的版本进行下载 之后的步骤,因为本人已经安装过MySQL数据库,而卸载重装会比较麻烦,卸载不干净会导致新的装不上,所以可以参考下面的博客,因为官网的改动,前面的部分已经与该博客不符,按照本人在上面的介绍寻找即可 https://blog.csdn

【ASP】ASP对Access数据库的连接、增删改查及ASP的基本语法

本文讨论的是ASP,而不是Visual Studio写出来的.ASPX也就是ASP.NET. ASP不需要任何插件的支持,关键你是配置好WINDOWS的IIS服务器,把页面扔在上面执行就可以了. 不同WINDOWS系统的IIS服务器配置,除了某些被阉割的WINXP装机版系统之外,都支持IIS服务器配置,都在WINDOWS的组件中,不需要下载任何东西.如何配置IIS服务器不是本文讨论的重点. 一.基本目标 假设Access2007数据库database.mdb中存在表test如下: id为自增列,

java H2数据库使用并实现增删改查功能

原文:java H2数据库使用并实现增删改查功能 代码下载地址:http://www.zuidaima.com/share/1550463278058496.htm package com.zuidaima.h2sql.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.St

MySQL数据库之表的增删改查

目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是硬盘上的一个文件夹,表table就是文件夹里面的一个文件 2.表中的一条记录就相当于文件中的一行内容,与excel表类似,表table中有不同的标题,称之为字段 3.本节对表结构做增删改查,即创建表.删除表.修改表.查看表结构,至于表中数据的增删改查日后单独总结 2 创建表 1.创建一张表,需要建一

Django 连接数据库,数据库表字段的增删改查

如何获取前端数据 request方法: 获取前端数据的方式: request.POST(获取表单中发送的数据).request.GET  (获取的是url后面跟的数据) 前端:注意name属性的值即为后台大字典的key ,即通过key来取到前端发过来的数据 后端: views :  request.POST.get()  方法默认取列表中的最后一个值,request.POST.getlist()    取列表 数据库:Django连接数据库配置: 1.   setting.py : 配置数据库

C#在winform中操作数据库,实现数据增删改查

1.前言: 运行环境:VS2013+SQL2008+Windows10 程序界面预览: 使用的主要控件:dataGridview和menuStrip等. 2.功能具体介绍: 1.首先,我们要先实现基本的数据操作,增删改查这几个操作. (1)先定义一个数据库操作的公共类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks

关于数据库的建立及增删改查

我们打开这个软件首先要看看是否存在这个数据库可以使用show databases:查看数据库是否存在如果不存在我们可以新建数据库用create database+数据库的名字:(新建数据库)use+数据库的名字:database changed(用这个数据库).而后就可以建立表了.用select *from+表名查看表中的数据. 现在先说一下怎样建立一个基本的表格 Create table+表名(<列明><数据的类型>[列级的约束条件] <列明><数据的类型>

数据库Dao层编增删改查写,数据库事务,数据库升级

数据库事务 有两个特点 1.安全性 情景:正常的转账行为,这个时候如果出现停电等异常,已经扣钱但是没有加钱:这个时候就可用数据库事务解决问题 2.高效性: 使用数据库事务添加享受同数量的数据,对比耗时少: 原理:没开始事务的是打开数据库,插入数据,关闭数据库: 开启事务的是数据存到内存,然后一次写入到数据库: 数据库升级 升级的时候版本号必须要大于等于2:而且要大于上一版本: 1 package com.example.databasedemo; 2 3 import android.conte