`
1140566087
  • 浏览: 559335 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18538
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:314177
Group-logo
J2ME 基础学习课程集
浏览量:18757
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17583
社区版块
存档分类
最新评论

Android 之 ContentProvider 共享数据库-通讯录

阅读更多
1、使用ContentProvider 共享数据:
ContentProvider 类主要方法的作用如下:

* public boolean onCreate(); -该方法在ContentProvider 创建后就会被调用,Android开机后,ContentProvider
在其它应用第一次访问时才会被创建;

* public Uri insert(Uri uri,ContentValues values);
-该方法用于外部应用往ContentProvider添加数据;
* public int delete(Uri uri ,String selection,String[] selectionArgs);
-该方法用于外部应用从ContentProvider删除数据;
* public int update(Uri uri ,ContentValues values ,String selection,String[] selectionArgs);
-该方法用于外部应用更新ContenProvider数据;
* public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
-该方法用于外部应用从ContentProvider获取数据;
* public String getType(Uri uri);
-该方法用于返回当前Url 所代表数据的MIME类型,

1.2 public String getType(Uri uri);该方法的使用介绍:
该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串
应该以vnd.android.cursor.dir/开头;
例如:要得到所有person记录的 Uri为content://cn.itcast.provider.personprovider/person,那
么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person。
如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头;
例如:得到id为10的person的记录,Uri为:content://cn.itcast.provider.personprovider/person/10,
那么返回的MIME类型字符串应该为:vnd.android.cursor.item/person;



2、使用ContentResolver操作ContentProvider中的数据:
* 工具类:ContentResolver
当外部的应用需要对ContentProvider中的数据进行添加、删除、修改和查询的操作时,可以使用ContentResolver类
来完成,要获取ContentResolver对象,可以使用Activity提供的getContentResolver()方法;ContentResolver提
供了与ContentProvider类相同签名的四个方法:
* public Uri insert(Uri uri,ContentValues values);
-往ContentProvider中添加数据;
* public int delete(Uri uri,String selection ,String[] selectionArgs);
-从ContentProvider中删除数据;
* public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
-更行ContentProvider中的数据;
* public Cursor query(Uri uri,String[] projectionm,String selection ,String[] selectionArgs,String sortOrder);
-该方法用于从Content中获取数据;

【注:以上所有方法的第一个参数Uri,代表要操作的ContentProvider和对其中的什么数据进行操作;】
例如:Uri.parse("content://cn.itcast.providers.personprovider/person/10");
表示:对主机名为:cn.itcast.providers.personprovider的ContentProvider进行操作,操作数据表person中id为
10的记录;

案例:模拟通讯录的操作:添加数据,删除,修改,查看;
使用小贴士:

首先:加入读写联系人信息的权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
   
    需要使用到的Uri:
    content://com.android.contacts/contacts 操作的数据是联系人的Uri;
    content://com.android.contacts/data/phone 联系人电话Uri;
    content://com.android.contacts/data/emails 联系人Email Uri;
   
    注:表中不同的MIME,对应的Uri是不同的,如需获取对应类型的信息,那么Uri必须相对应;
   
    具体实现代码:

package com.svse.contentprovider;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

	private Button insert ,delete,update,read;
	protected void init(){
		insert = (Button) findViewById(R.id.insertContact);
		delete = (Button) findViewById(R.id.deleteContacts);
		update = (Button) findViewById(R.id.updateContacts);
		read = (Button) findViewById(R.id.readContact);
	}
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		/* 初始化组件对象 */
		init();

		/* 为read设置按钮点击事件监听器 */
		read.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				readContacts();		
			}
		});
		
		insert.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				insertContacts();
			}
		});

		delete.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				deleteContacts();
			}
		});
		
		update.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//updateContacts();
			}
		});
	}

	/* 读取联系人信息 */
	public void readContacts(){
		/* 获取ContentResolver对象,使用getContentResolver()方法 */
		ContentResolver cr = this.getContentResolver();

		/**************************************联系人信息**********************************************/
		/* 执行查询操作,使用query();方法 */
		/* 参数说明:
		 * @ uri : 操作ContentProvider的Uri;
		 * @ projection :查询的列;
		 * @ selecion	:查询条件;
		 * @ selectionArgs	:条件对应参数;
		 * @ sortOrder		:排序方式;
		 */
		/* 获取联系人信息: Uri:ContactsContract.Contacts.CONTENT_URI*/
		Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);		

		/* 操作游标,获取数据 */
		for(cursor.moveToFirst();!cursor.isAfterLast();cursor.moveToNext()){

			/* 保存当前联系人的所有信息 */
			StringBuffer sb = new StringBuffer();

			/* 获取联系人ID */
			String contactID = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
			sb.append("ID:"+contactID+"\n");
			/* 获取联系人姓名 */
			String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
			sb.append("姓名:"+name+"\n");
			/**********************************************************************************************/
			/* 通讯录 表 的特点:保存数据是按行保存,即:每个数据信息占一行,每行中该种属性能有多个值:
			 * 例如 : 一个人的电话号码能有多个;即:一个contactID下有多个phone; */
			/**********************************************************************************************/

			/****************************获取电话号码*********************************************/
			//ContactsContract.CommonDataKinds.Phone.CONTENT_URI	获取Phone对应MIME类型的Uri;
			//ContactsContract.CommonDataKinds.Phone.CONTACT_ID		获取表中的联系人ID;
			Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?", new String[]{contactID}, null);
			while(phone.moveToNext()){
				String phoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
				sb.append("phone:"+phoneNumber+"\n");
				//Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" phone:"+phoneNumber, 1000).show();
			}
			/* 游标使用后要关闭 */
			phone.close();
			/**********************************************************************************************/

			/************************************获取Email*************************************************/
			Cursor email = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"=?", new String[]{contactID},null);
			while(email.moveToNext()){
				String emailAddress = email.getString(email.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
				sb.append("emailAddress:"+emailAddress+"\n");
				//Toast.makeText(MainActivity.this, "_ID="+contactID+" name="+name+" Email:"+emailAddress, 1000).show();
			}
			email.close();
			/**********************************************************************************************/


			Toast.makeText(MainActivity.this, sb.toString(), 1000).show();
		}
		cursor.close();


	}

	/* 添加联系人 */
	public void insertContacts(){
		
		/*************************************方式一*******************************************************/
		/* 首先:需要向RawContacts.CONTENT_URI 执行一个空值的插入,目的是获取系统返回的rawConatactId ,
		 * 这是后面插入data表的依据,只有执行空值的插入,才能使插入的联系人在通讯录里可见*/
		ContentValues values = new ContentValues();

		/* 向 RawContacts.CONTENT_URI执行一个空值的插入,返回rawContactId */
		Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values);

		/* 从Uri路径中获取  ID 的部分 */
		long rawContactId = ContentUris.parseId(rawContactUri);
		values.clear();
		
		/* data表中的数据结构特点:每个数据信息以行进行保存,所以每次添加一行数据 */
		
		/* 向data表中插入姓名 */
		values.put(Data.RAW_CONTACT_ID, rawContactId);	//ID
		values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);	//内容的类型
		values.put(StructuredName.GIVEN_NAME, "张三峰");
		this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		values.clear();
		
		/* 向data表中插入移动电话 */
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
		values.put(Phone.NUMBER, "15337178625");
		values.put(Phone.TYPE, Phone.TYPE_MOBILE);	//电话的类型:工作电话  移动电话 家庭电话
		this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		values.clear();
		
		/* 向data表中插入工作电话 */
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
		values.put(Phone.NUMBER, "02787878989");
		values.put(Phone.TYPE, Phone.TYPE_WORK);	//电话的类型:工作电话  移动电话 家庭电话
		this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		values.clear();
		
		/* 向data表中添加Email */
		values.put(Data.RAW_CONTACT_ID, rawContactId);
		values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
		values.put(Email.DATA, "15337178625@qq.com");
		values.put(Email.TYPE, Email.TYPE_WORK);	//电话的类型:工作电话  移动电话 家庭电话
		this.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
		values.clear();
		Toast.makeText(MainActivity.this, "数据添加成功!", 1000).show();
		/********************************************************************************************************/
		
		/*********************************方式二:批量添加,处于同一个事务**************************************/	
	}	
	
	/* 删除 */
	public void deleteContacts(){
		/* 首先获取CotentResolver对象,用于操作ContentProvider */
		ContentResolver cr = this.getContentResolver();
		
		/* 思路:删除一个联系人的所有,则根据RAW_CONTACT_ID进行删除 */
		cr.delete(RawContacts.CONTENT_URI, RawContacts.CONTACT_ID+"=?", new String[]{"1"});
		Toast.makeText(MainActivity.this, "数据删除成功", 1000).show();
	}
//
//	/* 修改 */
//	public void updateContacts(){
//		ContentResolver cr = this.getContentResolver();
//		
//		/* 获取ID,需要修改的联系人ID,然后确定修改信息 */
//		ContentValues values = new ContentValues();
//		values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//值的类型
//		values.put(StructuredName.GIVEN_NAME, "张无忌");
//		cr.update(ContactsContract.Contacts.CONTENT_URI, values, ContactsContract.Data.DISPLAY_NAME+"=?", new String[]{"张三峰"});
//		Toast.makeText(MainActivity.this, "修改成功", 1000).show();
//		readContacts();
//	}
//	
	

	/*  UriMathcer 类的用法  */
	public void uriMatcher(){
		/* 常量UriMatche.NO_MATCH 标示部匹配任何路径的返回码 */
		UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

		/* 如果match()方法匹配content://cn.itcast.provider.personprovider/person 路径,
		 * 返回匹配码为 1
		 */
		/* 添加需要匹配的URL ,如果匹配就会返回匹配码  */
		sMatcher.addURI("cn.itcast.provider.personprovider", "person", 1);

		/* # 为通配符 *//* match():方法匹配:content://cn.itcast.provider.personprovider/person/230 
		 * 路径, 返回匹配码2
		 *  */
		sMatcher.addURI("cn.itcast.provider.personprovider", "person/#", 2);

		/* 按上述添加的规则进行匹配,不同的路径匹配返回不同的匹配码 */
		int code = sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"));

		/**********************************************************************/
		//ContentUris 的介绍
		/* 将字符串转换成Uri */
		Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person");

		/* 为路径添加ID部分 */
		Uri resultUri = ContentUris.withAppendedId(uri, 10);

	}

}



















0
1
分享到:
评论

相关推荐

    Android课程设计--便捷通讯录

    【Android课程设计--便捷通讯录】是一个典型的移动应用开发项目,旨在帮助学生或开发者学习如何在Android平台上构建一个实用的通讯录应用。这个项目涵盖了Android应用程序开发的核心知识点,包括用户界面设计、数据...

    Android高级应用源码-通讯录+备份还原.zip

    Android中的`ContentProvider`是数据共享的桥梁,用于在不同应用程序之间提供数据访问。在这个项目中,`ContentProvider`会实现对通讯录数据的增删改查操作。通过`UriMatcher`匹配不同的URI请求,`ContentProvider`...

    Android四大组件之ContentProvider:简单的通讯录查询和添加

    总结来说,ContentProvider在Android中扮演着数据共享的重要角色,通过它,我们可以安全、便捷地在不同应用间共享和操作数据,如通讯录。理解并熟练掌握ContentProvider的使用,是每个Android开发者必备的技能之一。...

    android中contentprovider通讯录

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全、方便地访问和操作数据。本实例主要讲解如何在Android中利用ContentProvider实现通讯录功能,这对于理解...

    android实用的通讯录项目 已连接数据库

    3. **ContentProvider**:Android的ContentProvider是应用程序之间共享数据的标准接口。在这个通讯录项目中,ContentProvider被用来封装对SQLite数据库的操作,使得其他应用可以通过标准的URI请求访问通讯录数据。 ...

    android通讯录(完整,可运行)

    3. ContentProvider:作为数据访问接口,ContentProvider是Android系统中不同应用间共享数据的关键。我们需创建一个自定义的ContentProvider,覆盖其insert、delete、update和query方法,实现对联系人数据的操作。 ...

    手机通讯录

    在Android系统中,手机通讯录是用户日常生活中非常重要的数据之一。为了访问和操作这些数据,开发者通常会利用Android的四大组件之一——Content Provider。本Demo项目“手机通讯录”正是以此为基础,展示了如何通过...

    Android高级应用源码-android手机通讯录.zip

    首先,我们要了解Android系统的通讯录是通过Content Provider来实现数据的存取和共享。Content Provider作为Android四大组件之一,是应用程序之间数据交换的桥梁。在源码中,我们可以找到定义的Content Provider类,...

    Android通讯录的开发-完整代码

    3. **ContentProvider**:ContentProvider是Android系统提供的一种机制,使得不同应用之间可以共享数据。在这个项目中,自定义ContentProvider用于管理通讯录数据,使得其他应用可以通过标准的ContentResolver接口...

    Android高级应用源码-仿qq通讯录联系人.zip

    3. **Android ContentProvider**:为了在不同应用间共享联系人数据,可能用到了ContentProvider,这是Android中数据共享的标准接口。 4. **联系人API**:可能涉及到Android系统的联系人API,用于获取系统中的联系人...

    Android通讯录附搜索及字母索引Demo

    - 为了在不同应用之间共享数据,Android引入了ContentProvider。在这个Demo中,开发者可能会实现一个自定义的ContentProvider来处理联系人的存取,实现与系统的ContactsContract集成。 3. **CursorLoader和...

    android简易的通讯录

    - Android的ContentProvider组件用于在应用间共享数据。虽然这个项目可能是简单的,但了解如何使用ContentProvider进行数据访问是Android开发的重要部分。 5. **Activity与Intent** - Activity是Android应用的...

    Android学习之手机通讯录

    在Android开发中,掌握ContentProvider是至关重要的,因为它是Android四大组件之一,负责数据的共享与交换。本项目“Android学习之手机通讯录”聚焦于使用ContentProvider操作手机内置的通讯录,包括查询、添加和...

    android开发contentprovider教学ppt(内部资料).pptx

    在Android开发中,ContentProvider是四大核心组件之一,它扮演着跨应用数据共享的角色。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,实现数据的透明访问。本篇内容将深入讲解ContentProvider的...

    Android代码-公司通讯录(含来电号码姓名查询和搜索功能).zip

    6. ContentProvider:虽然不是必须的,但使用ContentProvider可以使数据与其他应用共享,遵循Android的数据提供者模式。这样,其他应用(如系统联系人应用)也可以访问并操作通讯录数据。 7. 异步处理:为了确保...

    Android高级应用源码-Android简易通讯录程序.zip

    5. ContentProvider:在Android系统中,ContentProvider是实现数据共享的标准接口。如果源码中使用了ContentProvider,我们可以学习如何通过Uri查询、插入、更新和删除数据,这对于跨应用数据共享非常有帮助。 6. ...

    android简易通讯录--适合初学者

    虽然在这个简单的通讯录应用中,ContentProvider可能不是必需的,但学习它的用法能帮助理解Android的数据共享机制。通过ContentResolver,其他应用或组件可以查询、插入、更新和删除数据库中的数据。 在添加或编辑...

    用android开发的仿qq的通讯录

    5. **ContentProvider**:它是Android系统中用于数据共享的机制,可以让其他应用访问你的应用数据。在通讯录应用中,ContentProvider用于管理SQLite数据库中的联系人信息。 6. **Adapters和ListView/RecyclerView**...

    Android 完整的通讯录项目源码.rar

    此外,Android提供了ContentProvider组件,它是应用程序之间共享数据的标准接口,你在实现通讯录应用时会用到它来管理和共享联系人信息。 其次,用户界面(UI)设计是关键。项目源码中会包含多个XML布局文件,用于...

    Android MyContacts通讯录源码-IT计算机-毕业设计.zip

    Android提供了SQLite数据库支持,MyContacts应用可能使用SQLiteOpenHelper来创建和升级数据库,以及ContentProvider来暴露数据库中的数据。SQLiteOpenHelper类用于管理数据库的创建和版本控制,而ContentProvider则...

Global site tag (gtag.js) - Google Analytics