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

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, "[email protected]");
        values.put(Email.TYPE, Email.TYPE_WORK);
        this.getContentResolver().insert(
                android.provider.ContactsContract.Data.CONTENT_URI, values);
    }

5.总结

(1) 在和通信录打交道 ,不要忘记 添加权限 ;

(2)Content Provider 实现跨应用之间的数据操作;

6.demo 免积分下载

http://download.csdn.net/detail/lablenet/9055113

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

时间: 2024-10-12 03:14:17

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

Android数据存储方式之:ContentProvider

ContentProvider是Android的四大组件之一,可见其重要性.我们使用到ContentProvider时,也要同Activity等其它组件一样,在AndroidManifest.xml中注册对应的组件才能使用.为什么会用ContentProvider来作为数据存储方式之一呢? ContentProvider在android中的作用是对外共享数据(应用之间数据共享),可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider

Android Contacts (android通讯录读取)-content provider

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android 数据存储 利用SQLiteDatabase实现简单的学生管理

转载请注明出处:明桑Android 这是作为上一篇Android 数据存储 如何搞定SQLite Database的实例练习,之所以单独列出来是因为除了数据库方面的知识,还涉及其它方面的知识,所以就写的详细点,啰嗦点.希望对初学者有所帮助.当然这个Demo比较简单,有很多可以改进的地方,但那不是这里探讨的重点,重点学习如何将SQLiteDatabase数据绑定到我们的界面! 本文代码地址:UseSQLitDatabase 我们要做一个简单的学生管理的demo,创建student.db,包括nam

【Android的从零单排开发日记】之入门篇(八)——Android数据存储(下)

废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite.在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内.从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行S

【Android的从零单排开发日记】之入门篇(七)——Android数据存储(上)

在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也是开发平台必须提供的基础功能.不光是在Android平台上,在其他的平台上,数据的存储永远是不可缺少的一块.Android的数据存储是构建在Linux的文件系统上,它充分利用Linux的账号系统来限定应用对数据的访问,部署了一套安全和灵活并重的数据存储解决方案.Android的文件框架,以及各种数据

Android数据存储(2):Internal Storage

Android数据存储的第二种形式是Internal Storage,即内部存储. 内存存储的特点是存储的是私有数据,其存储位置是在手机内存,一种是普通的文件存储,另一种是文本或图片在内存的缓存. 内部缓存的存放位置/data/data/包名/files 或 /data/data/包名/cache 1.create and write a private file to the internal storage: 步骤: 1)调用 openFileOutput()方法,返回的是一个FileOut

Android 数据存储方式分为哪几种?

10道题值得思考 第一道题 1.Android 数据存储方式分为哪几种? SharedPreferences存储数据 2. CotentProvider内容提供者 3. 文件存储 4. 数据库存储(Sqlite) 5.网络存储 2. NDK是什么? 1. 一系列工具类的集合 2. Arm指令集 3. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译器,并提供了相应的mk文件隔离

android数据存储_概述

andorid提供了六种方式存储永久的数据,根据需求来使用不同的存储方式,例如是否对于应用程序时私有还是公有,数据存储的空间等. 六个存储方式: 使用SharedPreferences: 这种方式是使用键值对来存储私有的数据 内部存储: 在设备的内存中存储私有数据 外部存储: 在SD卡或其他的外部存储来存储公有数据 SQLite数据库: 在私有的数据库中存储私有的结构花数据 网络存储: 在网络服务中存储数据 私有数据一般情况下不能被访问,但是可以通过content provider来进行对数据的

android数据存储_内部存储

源码下载(免下载积分):下载 你可以直接存储数据到内部存储中,默认情况下,文件存储到内部存储中是私有的,不能被 其他程序访问,当卸载应用程序,这些文件会被移除. 创建并写入数据可以有两种方法: 使用java中的相关的方法, 使用android.content中的相关方法,  调用 openFileOutput(),并返回FileOutputStream对象 调用FileOutputStream对象的write()方法 关闭流 读文件也是基本相同的方式. 在读文件有一点小技巧:如果想在编译时保存一