Android 联系人android数据库操作介绍以及对联系人的基本操作

Android数据库&
一、关系型数据库SQLIte
  每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库&SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
SQLite体系结构图如下:
  编译器包括Tokenizer(词法分析器)、 Parser(语法分析器)、Code Generator(代码产生器)。他们协同处理文本形式的结构化查询语句。
  后端由B-tree,Pager,OS Interface组成。B-tree的职责是负责排序,维护多个数据库页之间错综复杂的关系,将页面组织成树状结构,页面就是树的叶子。Pager负责传输,根据B-tree的请求从磁盘读取页面或者写入页面。
  公共服务中有各种实用的功能比如:内存分配、字符串比较,Unicode转换等。
&SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要&安装&,所以在使用的时候能够省去不少麻烦。
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
SQLite官方网站(),了解更多内容请前往。
二、导出查看数据库文件
  在android中,为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data/package_name/databases文件夹中。
  想要将数据库文件导出可以使用eclipse,如图所示:
  查看数据库,使用SQlite Database Browser,如图所示:
三、扩展类
3.1扩展SQLiteOpenHelper
  Android 不自动提供数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现三个方法:
  构造函数,调用父类 SQLiteOpenHelper 的构造函数
  onCreate()方法;// TODO 创建数据库后,对数据库的操作
  onUpgrage()方法。// TODO 更改数据库版本的操作
  当你完成了对数据库的操作(例如你的 Activity 已经关闭),需要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。
  操作数据库的最佳实践是创建一个辅助类,例如联系人模块
  class ContactsDatabaseHelper extends SQLiteOpenHelper
3.2 Cursor类
  Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。
3.3 数据类型
  SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为&弱类型&(manifest typing.)。
四、数据库操作
4.1创建和打开数据库
  在Android中创建和打开一个数据库都可以使用openOrCreateDatabase方法来实现,因为它会自动去检测是否存在这个数据库,如果存在则打开,如果不存在则创建一个数据库:创建成功则返回一个SQLiteDatebase对象,否则抛出异常FileNotFoundException。
下面我们来创建一个名为Test的数据库,并返回一个SQLiteDatabase对象mSQLiteDatabase。
mSQLiteDatabase=this.openOrCreateDatabase("Test",MODE_PRIVATE,null);
  通过execSQL方法来执行一条SQL语句。
String CREATE_TABLE="create table 表名(列名,列名,&&)";
mSQLiteDatabase.execSQL(CREATE_TABLE);
  创建表的时候总要确定一个主键,这个字段是64位整型,别名_rowid。其特点就是自增长功能。当到达最大值时,会搜索该字段未使用的值(某些记录被删除_rowid会被回收),所以要唯一严格增长的自动主键必须加入关键字autoincrement。
mSQLiteDatabase("drop table 表名");
4.4修改数据
4.4.1 插入记录
可以使用insert方法来添加数据,但是insert方法要求把数据都打包到ContentValues中,ContentValues其实就是一个Map,Key值是字段名称,Value值是字段的值。通过ContentValues的put方法就可以把数据放到ContentValues对象中,然后插入到表中去。具体实现如下:
ContentValues cv=new ContentValues();
cv.put(TABLE_NUM,1);
cv.put(TABLE_DATA,"测试数据库数据");
mSQLiteDatabase.insert(Test,null,cv);
//同样可以使用execSQL方法来执行一条&插入&的SQL语句
String INSERT_DATA="insert into 表名(列名,&&) values (值,&&)";
mSQLiteDatabase.execSQL(INSERT_DATA);
4.4.2 更新记录
ContentValues cv=new ContentValues();
cv.put(TABLE_NUM,3);
cv.put(TABLE_DATA,"修改后数据");
mSQLiteDatabase.update(Test,cv,"num"+"="+rowId,null);
//同样可以使用execSQL方法来执行一条&更新&的SQL语句
String UPDATE_DATA="update 表名 set 列名=xxx where xxx;
mSQLiteDatabase.execSQL(UPDATE_DATA);
update 表名 set 列名=xxx [where条件]
4.4.3 删除记录
//要删除数据可以使用delete方法
mSQLiteDatabase.delete("Test","WHERE _id="+0,null);
//也可以通过execSQL方法执行SQL语句删除数据
mSQLiteDatabase.execSQL("delete from 表名 where 条件");
SELECT 列名 FROM 表名 WHERE 条件
例如在联系人中保存3个联系人,data表如下:
查询data1值为10086的项
对查询条件和返回值稍做修改
LIKE的使用
Like经常和 %或者 _ 搭配使用。
%可与任意0个或者多个字符匹配,_可与任意单个字符匹配。
GLOB的使用
Glob与like非常相似,常与 * 搭配。
限定和排序
关键字:order、limit、offset。
Order分为asc(默认升序),desc(降序)。
内连接:通过表中两个字段进行连接,找出两个集合的交集。
& select& xxx from 表名1 inner join 表名2 on 表名1.列名 = 表名2.列名
左外连接:左表的所有项和内连接项。
& select& xxx from 表名1 left outer join 表名2 on 表名1.列名 = 表名2.列名
五、高级特性
  视图是虚拟表,它的内容都派生自其它表的查询结果。虽然它看起来像基本表,但是它不是,因为基本表的内容是持久的,而视图的内容是使用时动态产生的。
  create view 表名 as 定义
  索引是一种用来在某种条件下加速查询的结构。
  create index 索引名 on 表名(列名)
5.3 触发器
  触发器的作用是当具体的表发生特定的数据事件时,执行对应的操作。
  create trigger 触发器名 [before|after] [insert|delete|update|update of columns] on 表名 action
首先还谢谢是提供底稿的同事,这里只是介绍了基础的东西,感兴趣的同学,请SQLite官方网站()了解。
这里提供一个博客园的博客
具体地址:
其中的评论说道:
有两点需要注明一下:1. data/data这个目录是需要root权限的;2. adb shell进入手机后,不是每个手机都能找到sqlite3这个命令的。至少说我们拿到的工程样机里面就没有。
阅读(...) 评论()9716人阅读
一、 联系人数据库
 联系人的数据库文件的位置
/data/data/com.android.providers.contacts/databases.contacts2.db
 数据库中重要的几张表
1、contacts表
该表保存了所有的手机测联系人,每个联系人占一行,该表保存了联系人的
ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加
到收藏夹等信息。
2、raw_contacts表
该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标
识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,
从而将contacts表和raw_contacts表联系起来。该表保存了联系人的
RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添
加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
3、 mimetypes
该表定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。
 该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表
保存了两个ID:MimeTypeID和RawContactID,从而将data表和
raw_contacts表联系起来。
 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据
MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,
data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。
二、对联系人的基本操作
 这里的基本操作只是针对手机测的联系人,(U)SIM侧的联系人的操
作后续介绍。
 如果对联系人的基本操作,我们必须得到许可。
方法就是在AndroidManifest.xml文件中配置如下权限:
&uses-permission android:name=&android.permission.READ_CONTACTS&
&uses-permission android:name=&android.permission.WRITE_CONTACTS&
读取联系人
分为以下步骤:
1、先读取contacts表,获取ContactsID;
2、再在raw_contacts表中根据ContactsID获取RawContactsID;
3、然后就可以在data表中根据RawContactsID获取该联系人的各数据了。
// 获取用来操作数据的类的对象,对联系人的基本操作都是使用这个对象
ContentResolver cr = getContentResolver();
// 查询contacts表的所有记录
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
null, null);
// 如果记录不为空
if (cur.getCount() & 0)
// 游标初始指向查询结果的第一条记录的上方,执行moveToNext函数会判断
// 下一条记录是否存在,如果存在,指向下一条记录。否则,返回false。
while (cur.moveToNext())
String rawContactsId = &&;
String id =
cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
str += &ID:& + id + &\n&;二、对联系人的基本操作(4)
// 读取rawContactsId
Cursor rawContactsIdCur = cr.query(RawContacts.CONTENT_URI,
RawContacts.CONTACT_ID +& = ?&,
new String[]{id}, null);
// 该查询结果一般只返回一条记录,所以我们直接让游标指向第一条记录
if (rawContactsIdCur.moveToFirst())
// 读取第一条记录的RawContacts._ID列的值
rawContactsId =
rawContactsIdCur.getString(rawContactsIdCur.getColumnIndex(
RawContacts._ID));
rawContactsIdCur.close(); // 读取号码
If (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.
Contacts.HAS_PHONE_NUMBER))) & 0)
// 根据查询RAW_CONTACT_ID查询该联系人的号码
Cursor PhoneCur =
cr.monDataKinds.Phone.CONTENT_URI,
monDataKinds.Phone.RAW_CONTACT_ID +& =
new String[]{rawContactsId}, null);
// 上面的monDataKinds.Phone.CONTENT_URI
// 可以用下面的phoneUri代替
Uri phoneUri=Uri.parse(&content://com.android.contacts/data/phones&);二、对联系人的基本操作(6)
// 一个联系人可能有多个号码,需要遍历
while (PhoneCur.moveToNext())
// 号获取码
String number =
PhoneCur.getString(PhoneCur.getColumnIndex(
monDataKinds.Phone.NUMBER));
// 获取号码类型
String numberType =
PhoneCur.getString(PhoneCur.getColumnIndex(
monDataKinds.Phone.TYPE));
PhoneCur.close();
新建联系人
新建联系人时, 根据contacts、raw_ contacts两张表中ID的使用情况,自动
生成ContactID和RawContactID。
Android源码新建重复姓名的联系人的ContactID是不重复的,所以会重复显
用下面的代码新建联系人,如果多次新建的联系人的姓名是一样的,生成的
ContactID也会重复,RawContactID不会重复,我们在读取联系人的时候可
以获取所有同姓名联系人的号码等信息,在显示联系人的时候,重复姓名的
联系人的所有字段信息都会合并起来显示为一个联系人。
ContentValues values = new ContentValues();
Uri rawContactUri =
getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);二、对联系人的基本操作(8)
// 向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,
// 向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,
 删除联系人
Android帮助文档:When a raw contact is deleted, all of its Data rows as
well as StatusUpdates, AggregationExceptions, PhoneLookup rows are
deleted automatically.
所以,要删除联系人,我们只需要将raw_contacts表中指定RawContactID的
行删除,其他表中与之关联的数据都会自动删除。
public void delete(long rawContactId)
getContentResolver().delete(ContentUris.withAppendedId(RawContac
ts.CONTENT_URI, rawContactId), null, null);
 更新联系人
联系人的所有信息都是保存在data表中,所以要更新联系人,我们只需要根
据RawContactID和MIMETYPE修改data表中的内容。
ContentValues values = new ContentValues();
values.put(Phone.NUMBER, “123&);
values.put(Phone.TYPE, Phone.TYPE_MOBILE);
String Where = ContactsContract.Data.RAW_CONTACT_ID + & = ? AND
& + ContactsContract.Data.MIMETYPE + & = ?&;
String[] WhereParams = new String[]{&5&, Phone.CONTENT_ITEM_TYPE};
getContentResolver().update(ContactsContract.Data.CONTENT_URI,
values, Where, WhereParams);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:154765次
积分:1951
积分:1951
排名:第9117名
原创:23篇
转载:103篇
评论:14条
(1)(1)(27)(19)(9)(8)(28)(32)(1)Android联系人模块分析(一)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
&&¥5.00
喜欢此文档的还喜欢
Android联系人模块分析(一)
A​n​d​r​o​i​d​联​系​人​模​块​分​析​(​一​)
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Android_联系人数据库介绍以及对联系人的基本操作
下载积分:1000
内容提示:
文档格式:PPT|
浏览次数:43|
上传日期: 07:25:23|
文档星级:
该用户还上传了这些文档
Android_联系人数据库介绍以及对联系人的基本操作.PPT
官方公共微信

我要回帖

更多关于 android sqlite数据库 的文章

 

随机推荐