ContentProvider 基础
2015-11-21 01:41
387 查看
</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();
// 就正常运行了
相关文章推荐
- php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统
- php常用函数
- 阿里云自定义日记文件无法通过ftp下载
- 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明
- 阿里云本地FTP怎么连接?通用win7,win8,win8.1,win10
- PHP 判断常量,变量和函数是否存在
- php编译错误自我总结
- php编译部分错误及解决方法
- yii执行流程
- php中商品无限极分类
- 当php懈垢windows通用上传缺陷
- PHP实现文件上传
- XML省市区三级联动
- 【博客开篇】服务器配置:Windows2008R2+PHP5.6+SQLServer2008(X64)
- PHP正则表达式
- PHP语法(二):数据类型、运算符和函数
- php后台“爬虫”模拟登录第三方系统(二)---正则表达式的介绍
- 一步一步制作yaffs/yaffs2根文件系统(八)---总结及怎么样使系统自动启动自己编写的程序
- 一步一步制作yaffs/yaffs2根文件系统(七)---真挚地道歉以及纠正前边出现的错误!
- 一步一步制作yaffs/yaffs2根文件系统(六)---完善命令行提示符