ContentProvider 基础

原创 2015年11月21日 01:41:45
</pre><p></p><pre name="code" class="java">
import java.util.ArrayList;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.test.AndroidTestCase;
import android.util.Log;

public class ContactsReadTest  {
	private static final String TAG = "ContactsReadTest";
	private Context ctx = null ;
	// 这些Uri的地址在类 android.provider.ContactsContract
	// 定义了各种联系人相关的URI和每一种类型信息的属性信息
	// 表地址
	private static final Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;
	private static final Uri PHONE_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
	private static final Uri EMAIL_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;

	// 字段名
	private static final String _ID = ContactsContract.Contacts._ID;
	private static final String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
	private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
	private static final String CONTACT_ID = ContactsContract.Data.CONTACT_ID;

	private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
	private static final String PHONE_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE;
	private static final String EMAIL_DATA = ContactsContract.CommonDataKinds.Email.DATA;
	private static final String EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE;
	
	
	public ContactsReadTest (Context con) {
		this.ctx = con;
	}
	


	public void testReadContact() {
		
		System.out.println("println called in testReadContact");
		Log.i(TAG,"Im running... testReadContact");
//		ContentResolver resolver = getContext().getContentResolver();
		ContentResolver resolver = ctx.getContentResolver();
		Cursor c = resolver.query(CONTACTS_URI, null, null, null, null);
		Log.d(TAG,"calling testReadContact ...");
		while (c.moveToNext()) {
			int _id = c.getInt(c.getColumnIndex(_ID));
			String displayName = c.getString(c.getColumnIndex(DISPLAY_NAME));
			Log.i(TAG, displayName);
			ArrayList<String> phones = new ArrayList<String>();
			ArrayList<String> emails = new ArrayList<String>();
			String selection = CONTACT_ID + "=" + _id;

			int hasPhoneNumber = c.getInt(c.getColumnIndex(HAS_PHONE_NUMBER));
			if (hasPhoneNumber > 0) {
				Cursor phc = resolver.query(PHONE_URI, null, selection, null,
						null);
				while (phc.moveToNext()) {
					String phoneNumber = phc.getString(phc
							.getColumnIndex(PHONE_NUMBER));
					int phoneType = phc.getInt(phc.getColumnIndex(PHONE_TYPE));
					phones.add(getPhoneTypeNameById(phoneType) + ":"
							+ phoneNumber);
				}
				phc.close();
			}

			Log.i(TAG, "phones:" + phones);

			Cursor emc = resolver.query(EMAIL_URI, null, selection, null, null);
			while (emc.moveToNext()) {
				String emailData = emc
						.getString(emc.getColumnIndex(EMAIL_DATA));
				int emailType = emc.getInt(emc.getColumnIndex(EMAIL_TYPE));
				emails.add(getEmailTypeNameById(emailType) + ":" + emailData);
			}
			emc.close();
			Log.i(TAG,"emails:" + emails);
		}
		c.close();
	}

	private String getEmailTypeNameById(int emailType) {
		switch (emailType) {
		case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
			return "home";
		case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
			return "work";
		case ContactsContract.CommonDataKinds.Email.TYPE_OTHER:
			return "other";
		default:
			return "none";
		}
	}

	private String getPhoneTypeNameById(int phoneTypeId) {
		switch (phoneTypeId) {
		// 直接return 所以省略了break;
		case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
			return "home";
		case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
			return "mobile";
		case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
			return "work";
		default:
			return "none";
		}
	}
}
<pre name="code" class="java">	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		readContactsBtn = (Button) findViewById(R.id.readContactsBtn);
		readContactsBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				ContactsReadTest ct = new ContactsReadTest(MainActivity.this);
				ct.testReadContact();
			}
		});
	}



// 联系人表,电话号码表和EMAIL表, 是分开放的, 所以要查询联系人信息, 需要三个表的URI地址.
// 联系人表的相关的信息都在 ContactsContract.Contacts类中
// 电话号码和EMAIL地址 相关的表信息在类ContactsContract.CommonDataKinds.Phone (和 Email) 中
// 比如联系人表地址 ContactsContract.Contacts.CONTENT_URI
// 表中的字段名有 _ID 这个ID 相当于的主键
// 而三张表 还需要联系人ID来关联, 所以每张表里面都有联系人ID , 这个ID是外键(ContactsContract.Data.CONTACT_ID)
// 程序中对联系人表进行遍历 , 对每一个Contact表每个_ID , 先找出其 CONTACT_ID
// 再查询联系人表是否存在电话号码 c.getColumnIndex(HAS_PHONE_NUMBER)
// 存在电话的话, 就根据CONTACT_ID 去查询电话号码表  并输出
// 然后根据CONTACT_ID查询邮件表并输出
// 
// 调试的时候 获取resolver原本是
// ContentResolver resolver = getContext().getContentResolver();
// 而且原文用的JUtil , 且让这个类是继承自AndroidTestCase , 应该是JUtil 3版本吧
// 跑的时候getContext() 这个地方始终返回是空,  我用的JUtil 4 测试的 , 后来new 一个activity传进去
// 虽然resolver不再提示空的错误, 测试类里的方法可以跑起来, 但是却没有输出, 不知道什么原因.
// 最后还是不得已换成界面方式 Activity测试.  getContentResolver 需要一个Context, AndroidTestCase这个类 getContext()怎么能调用成功的呢?
// 传递MainActivity.this 后 ContentResolver resolver = ctx.getContentResolver();
// 就正常运行了



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

Android基础入门教程——4.4.1 ContentProvider初探

Android基础入门教程——4.4.1 ContentProvider初探 本节引言: 1.ContentProvider概念讲解: 2.使用系统提供的ContentProvider 1)简单的读取...
  • zpj779878443
  • zpj779878443
  • 2015年08月22日 12:23
  • 7763

Android动态部署六:如何从插件apk中启动BroadcastReceiver和ContentProvider

实现Android动态部署的过程中最重要的是从插件apk中启动四大组件,经过前面几篇文章的分析,现在只剩下BroadcastReceiver和ContentProvider了,BroadcastRec...
  • ximsfei
  • ximsfei
  • 2016年04月07日 11:35
  • 2834

ContentProvider的理解与使用

contentProvider的认识,自定义,使用,以及ContentObserver
  • u012858833
  • u012858833
  • 2016年06月19日 11:17
  • 9286

ContentProvider数据库共享之——实例讲解

前言:现在这段时间没这么忙了,要抓紧时间把要总结的知识沉淀下来,今年重新分了项目组,在新项目中应该不会那么忙了,看来有时间来学一些自己的东西了。现在而言,我需要的是时间。只要不断的努力,总有一天,你会...
  • u014628886
  • u014628886
  • 2016年07月26日 11:47
  • 584

Android 进阶11:进程通信之 ContentProvider 内容提供者

学习启舰大神,每篇文章写一句励志的话,与大家共勉。When you are content to be simply yourself and don’t compare or compete, ev...
  • u011240877
  • u011240877
  • 2017年06月02日 23:24
  • 2544

使用ContentProvider实现数据共享

1、数据共享标准:ContentProvider简介 ContentProvider是不同应用程序之间进行数据交换的标准API,ContentProvider以某种Uri的形式对外提供数据,允许...
  • u013847120
  • u013847120
  • 2015年05月05日 20:23
  • 904

ContentProvider 封装操作文件

示例简单代码//用 contentProvider 封装 对 文件的操作public class MyFileContentProvider extends ContentProvide...
  • kongbaidepao
  • kongbaidepao
  • 2016年12月09日 16:48
  • 285

ContentProvider往通讯录添加联系人和获取联系人

http://www.cnblogs.com/linjiqin/archive/2011/05/30/2063669.html 在Android中,可以使用ContentResolv...
  • u011955252
  • u011955252
  • 2015年12月09日 10:25
  • 385

Android 四大组件之ContentProvider工作原理

ContentProvider是一种内容共享型组件,实际上它是通过Binder向其它应用提供数据。当ContentProvider所在的进程启动时,ContentProvider会同时启动并被发布到A...
  • tianmi1988
  • tianmi1988
  • 2016年04月06日 18:43
  • 1803

Android四大组件——ContentProvider的增删改查和优化

前言ContentProvider步骤:创数据库,写规则匹配,配置manifests,另一个应用使用其实ContentProvider就是:在一个匹配器中写入自己写好的匹配规则,并对外提供写好的匹配规...
  • qq_30379689
  • qq_30379689
  • 2016年08月05日 15:53
  • 1841
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ContentProvider 基础
举报原因:
原因补充:

(最多只允许输入30个字)