欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ContentResolver

程序员文章站 2022-03-01 15:52:14
...
数据在android中是私有的,当然这而数据包括文件数据和数据库数据以及一些其他类型的数据。那么两个程序之间如何进行数据交换呢?解决这个问题主要靠ContentProvider。一个ContentProvider类实现了一组标准的方法接口,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。也就是说一个程序可以通过实现ContentProvider的抽象接口将自己的数据暴露出去。外界根本看不到,也就不用看到这个应用暴露的数据在应用当中如何存储的,或者是用数据库存储还是文件存储,还是网络存储。外界可以通过这套标准及统一的接口和程序中的数据打交道,可以操作程序中的数据。
外界的程序通过ContentResolver接口可以访问ContentProvider提供的数据,在Activity当中通过getContentResolver可以得到当亲的ContentResolver实例。ContentResolver提供的接口和ContentProvider中需要实现的接口对应。在ContentResolver中到相应的接口的话,ContentProvider会执行相应的接口,把结果返回。
要读取通讯录,要配置一下权限:
<uses-permission android:name="android.permission.READ_CONTACTS"/>

稍微解释一下代码,首先通过ContentResolver来查询出所有通讯录中的cursor,然后将Cursor传入一个自定义的CursorAdapter,将该adapter绑定给一个AutoCompleteTextView。
package com.kevin.contentresolver;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;

public class Main extends Activity {
private AutoCompleteTextView autoTextView;
private TextView tv_result;
private Cursor cursor;
private ContactAdapter adapter;
private ContentResolver resolver;
// 要去取出通讯录的字段
public static final String[] PEOPLE_PROJECTION = {
ContactsContract.Contacts._ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.Contacts.DISPLAY_NAME
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
autoTextView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
tv_result = (TextView)findViewById(R.id.tv_result);
// 取得ContentResolver对象
resolver = getApplication().getContentResolver();
// 取得通讯录的Cursor
/*
* 第一个参数是一个使用content:// scheme的URI
* 第二个参数是要返回的列名,为空则返回全部
* 第三个参数是where条件
* 第四个参数是条件的值
* 第五个参数是排序
*/
cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PEOPLE_PROJECTION, null, null, null);
// 将cursor传入自己实现的ContactsAdapter
adapter = new ContactAdapter(this, cursor);
autoTextView.setAdapter(adapter);
autoTextView.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// 取得Cursor
Cursor c = adapter.getCursor();
// 移动到所点击的位置
c.moveToPosition(position);
String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
// 找不到电话时显示无输入电话
number = number == null ? "无输入电话" : number;
tv_result.setText(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
+ "的电话是 " + number);
}
});
}
}
相关标签: Android