码迷,mamicode.com
首页 > 移动开发 > 详细

Android-数据存储(Content Provider ,调用系统 联系人 ContentProvider实现查询和增加联系人)

时间:2015-08-27 18:45:12      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:contentprovider   通信录   联系人添加   联系人读取   android   

1.回顾

   上篇学习了 安卓的 文件存储 ,包括  存储在 sd卡上;

2.重点 

  (1)了解 四大组件之一 Content Provider 
  (2)实现 查询通信录中 联系人
  (3)实现 新增联系人到通信录

3.介绍

 (1) ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。
 (2)它能够实现跨应用之间的数据操作。
 (3)利用ContentResolver对象的delete、update、insert、query等方法去操作 ContentProvider的对象,
 (4)让  ContentProvider对象的方法去对数据操作。

4.例子

    ——调用通信录实现 联系人的查询和添加——

  4.1 效果图

                                                   技术分享

    4.2 添加权限

   在 AndroidMainfest.xml 文件中添加 ,读取联系人和添加联系人的权限
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>


    4.3 查询联系人实现

/*
	 * 查询联系人
	 */
	private void selectContact(){
		/**
		 * 使用ContentResolver 实现 这个和 ContentProvider 的参数 一模一样
		 * 
		 * 联系人的 URI 提供: ContactsContract.Contacts.CONTENT_URI
		 */

		// 查询联系人
		ContentResolver resolver = getContentResolver();

		Cursor cursor = resolver.query(Contacts.CONTENT_URI, new String[] {Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null);

		String str = "联系人:\n";

		if (cursor != null) {
			while (cursor.moveToNext()) {
				
					String id=cursor.getString(cursor.getColumnIndex(Contacts._ID));
					String name=cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME));
				    str+=" id="+id+" name="+name; 
				    //通过id 查询 电话
				   Cursor c=resolver.query(Phone.CONTENT_URI,new String[]{Phone.NUMBER,Phone.TYPE},Phone.CONTACT_ID+"=?",new String[]{id},null);
				   if(c!=null){
					   while(c.moveToNext()){
						   String num=c.getString(c.getColumnIndex(Phone.NUMBER));
						   String type=c.getString(c.getColumnIndex(Phone.TYPE));
						   str+=" num="+num+" type="+type;
					   }
					   c.close();
				   }
					
					str+="\n";
			}
			cursor.close();
		}
		
		tv_show.setText(str);
	}


   4.4 实现 添加 联系人

	/**
     * 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId 
     * 
     * 这是后面插入data表的数据,只有执行空值插入,才能使插入的联系人在通讯录里可见
     */
    public void testInsert(){
        ContentValues values = new ContentValues();
        //首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
        Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values);
        long rawContactId = ContentUris.parseId(rawContactUri);
        
        //往data表入姓名数据
        values.clear();
        values.put(Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
        values.put(StructuredName.GIVEN_NAME, "我是测试联系人");
        this.getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);
        
        //往data表入电话数据
        values.clear();
        values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
        values.put(Phone.NUMBER, "10000000010001");
        values.put(Phone.TYPE, Phone.TYPE_MOBILE);
        this.getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);

        //往data表入Email数据
        values.clear();
        values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId);
        values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
        values.put(Email.DATA, "labelnet@outlook.com");
        values.put(Email.TYPE, Email.TYPE_WORK);
        this.getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);
    }


5.总结

  (1) 在和通信录打交道 ,不要忘记 添加权限 ;
  (2)Content Provider 实现跨应用之间的数据操作;

6.demo 免积分下载


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android-数据存储(Content Provider ,调用系统 联系人 ContentProvider实现查询和增加联系人)

标签:contentprovider   通信录   联系人添加   联系人读取   android   

原文地址:http://blog.csdn.net/lablenet/article/details/48030993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!