您的位置:首页 > 编程语言 > PHP开发

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();

// 就正常运行了


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: