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基础ContentProvider简介

ContentProvider是应用程序之间共享数据的接口 除了ContentProvider可以使应用程序之间实现数据共享之外,还有文件,sp等,存在sd卡上既可以实现文件、sp的数据共享。 1...

Android基础组件-ContentProvider(一)

ContentProvider是Android核心组件之一。 ContentProvider表示“内容提供者”, 开发人员在创建它时,需要自定义一个类继承ContentProvider,并重写...

ContentProvider基础

ContentProvider应该和SqliteDataBase一起使用使用方法:一、新建ContentProvider实现类 1.实现query,insert,update,delete,g...

Android基础之初识ContentProvider

Android基础之初识Content Provider

【Android基础知识】ContentProvider(三)使用ContentResolve查询和修改通讯录

在Android中,可以使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作。 在对联系人进行操作时需加入以下两个权限   content://...

基础总结篇:ContentProvider之读写联系人

在Android中,ContentProvider是一种数据包装器,适合在不同进程间实现信息的共享。 例如,在Android中SQLite数据库是一个典型的数据源,我们可以把它封装到ContentP...

基础总结篇:创建及调用自己的ContentProvider

鍥而捨之,朽木不折;鍥而不捨,金石可鏤。戰國.荀子《勸學篇》 若不能坚持到底,即使是朽木也不能折断;只要坚持不停地用刀刻,就算是金属玉石也可以雕出花饰。用今天的话来说就是:再容易的事情,没有锲而不舍...

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

Android基础入门教程——4.4.1 ContentProvider初探 本节引言: 1.ContentProvider概念讲解: 2.使用系统提供的ContentProvider 1)简单的读取...

基础总结篇之八:创建及调用自己的ContentProvider

鍥而捨之,朽木不折;鍥而不捨,金石可鏤。戰國.荀子《勸學篇》 若不能坚持到底,即使是朽木也不能折断;只要坚持不停地用刀刻,就算是金属玉石也可以雕出花饰。用今天的话来说就是:再容易的事情,没有锲而不舍...
  • wy819
  • wy819
  • 2016-05-19 18:57
  • 72

Android基础知识总结---四大组件之一ContentProvider(一)

一、ContentProvider的简介1.当系统部署多个Android应用之后,有时候就需要在不同的应用之间共享数据,比如现在有一个短信接收应用,用户想把接收到的陌生短信的发信人添加到联系人管理应用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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