Android ContentProvider之联系人数据库及操作
2015-03-24 17:04
281 查看
通讯录数据库的主要表之间架构关系:第一层:Data层,每种独立的数据类型占一行。具体哪些独立的数据可以占一行,可以在mimetypes这张表中找到, 原生Android的系统 一共12种,例如name,phone,email ect..第二层:RawContracts层,由Data层的多条数据组合成一个完整的联系人信息。第 三层:Contracts层,这一层主要注意与第二层的区别。大部分情况下这两层的数据时指同一个联系人的信息,即他们俩是一一对应的关系,但是有些特殊 情况,这个我是查了一些老外的论坛加上自己的理解,例如 我做一个本地通信录和网络上的通信录同步的时候,可能有一个人他在本地存在,他在网络上也存在,这个时候Android就可以识别他们,认为他们两个其实 是指同一个人。 (这种情况我没有试出来,我感觉这个其实是Android创造了这个概念之后,留给我们开发自己去实现的。)开发主要用到前两层contacts.db中三个比较重要的表:1.“mimetype”是电话 或者 姓名 的标示符编码:例如:电话 对应“vnd.android.cursor.item/phone_v2”姓名 对应“vnd.android.cursor.item/name”邮件 对应“vnd.android.cursor.item/email_v2”根据mimetype确定data的类型2.Uri uri = Uri.parse(“content://com.android.contacts/raw_contacts”);raw_contacts表该表保存了所有创建过的手机测联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,该表保存了两个ID:RawContactID和ContactID,从而将contacts表和raw_contacts表联系起来。该表保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。 3Uri dataUri = Uri.parse (“content://com.android.contacts/data”);data表Ø 该表保存了所有创建过的手机测联系人的所有信息,每个字段占一行 ,该表保存了两个ID:MimeTypeID和RawContactID,从而将data表和raw_contacts表联系起来。Ø 联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。如保存号码(MimeTypeID=5)的那行数据中,data1列保存号码,data2列保存号码类型(手机号码/家庭号码/工作号码等)。
/** * 查看所有联系人 * */ public void checkClick(View view){ ll = (LinearLayout) findViewById(R.id.ll); //2个关键的URI Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); //1.去raw_contacts获取联系人的_id Cursor query = getContentResolver().query(uri, new String[]{"_id"}, null, null, null); if(query != null && query.getCount() > 0){ while(query.moveToNext()){ //从cursor结果集的第一位得到id int id = query.getInt(0); //SQL查询语句 select * from raw_contact where _id = ? String selection = "raw_contact_id = ?"; String[] selectionArgs = {String.valueOf(id)}; //查询结果集cursor Cursor cursor = getContentResolver().query(dataUri, new String[]{"data1","mimetype"}, selection, selectionArgs, null); if(cursor!=null && cursor.getCount() > 0){ //从cursor中取出我们需要的联系人姓名和电话 while(cursor.moveToNext()){ String data1 = cursor.getString(0); String mimetype = cursor.getString(1); String tag = "联系人:"; TextView tv = new TextView(this); if("vnd.android.cursor.item/phone_v2".equals(mimetype)){ // Log.i(tag , "电话:" + data1); tv.setText( "【 电话: " + data1); } else if("vnd.android.cursor.item/name".equals(mimetype)){ // Log.i(tag,"姓名:" + data1); tv.setText(" 姓名: " + data1 + " 】"); } ll.addView(tv); } cursor.close(); } } query.close(); } }
/** * 添加联系人 * */ public void addClick(View view){ Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri dataUri = Uri.parse("content://com.android.contacts/data"); int contact_id = 0; //向raw_contacts表中增添一条数据 //1.首先要知道已经有了多少条数据,我们要往第多少条id上插入数据 Cursor cursor = getContentResolver().query(uri, new String[]{"contact_id"}, null, null, "contact_id desc limit 1"); if(cursor != null && cursor.moveToFirst()){ //获取当前通讯录中人数最大值 contact_id = cursor.getInt(0); contact_id ++; cursor.close(); //先往raw_contacts表中插入id ContentValues values = new ContentValues(); values.put("contact_id", contact_id); getContentResolver().insert(uri, values); //2.raw_contacts表中有了我们要添加的id,就可以往data表中那个id对应的地方添加数据 /*添加数据时需要三个值: mimetype, data1对应的类型 data1, 数据 raw_contact_id 要插入的地方,也就是之前得到的那个id */ //存入号码 values = new ContentValues(); values.put("mimetype","vnd.android.cursor.item/phone_v2" ); values.put("data1", "55555555555"); values.put("raw_contact_id", contact_id); getContentResolver().insert(dataUri, values); //存入姓名 values = new ContentValues(); values.put("mimetype","vnd.android.cursor.item/name" ); values.put("data1", "我我我我我我我"); values.put("raw_contact_id", contact_id); getContentResolver().insert(dataUri, values); //存入邮箱 values = new ContentValues(); values.put("mimetype","vnd.android.cursor.item/email_v2" ); values.put("data1", "wo555@555.com"); values.put("raw_contact_id", contact_id); getContentResolver().insert(dataUri, values); } Toast.makeText(this, "添加成功 :" + contact_id, 0).show(); }
相关文章推荐
- android中跨项目的数据库操作ContentProvider的使用
- Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容
- Android中通过ContentProvider操作数据库
- android数据库操作(ContentProvider)
- 类查找android中跨项目的数据库操作ContentProvider的使用
- Android 联系人数据库介绍以及对联系人的基本操作
- [Android Pro] 判断Uri对应的ContentProvider所操作的数据库u存在,及DownloadManager的暂停,继续
- Android 联系人数据库介绍以及对联系人的基本操作
- Android-ContentProvider数据库操作
- android: ListView,及数据库操作,模拟实现 联系人功能
- Android--操作联系人的ContentProvider
- Android ContentProvider(类容提供者)之操作通讯录联系人 添加查询联系人
- Android 联系人数据库介绍以及对联系人的基本操作
- android 联系人操作: ContentProvider往通讯录添加联系人和获取联系人
- Android 联系人数据库介绍以及对联系人的基本操作
- android 玩转ContentProvider之一--实现ContentProvider操作数据库
- Android 联系人数据库操作
- Android基础之ContentProvider操作本地短信数据库
- Android 联系人数据库介绍以及对联系人的基本操作
- Android 联系人数据库介绍以及对联系人的基本操作