当应用程序需要与别的应用进行交互时,需要使用Android提供的两个类,ContentProvider和ContentResolver来实现相关功能。ContentProvider用来提供内容给别的应用来操作,ContentResolver用来操作(包括查询、插入等)别的应用数据,当然在自己的应用中也可以。 本着重讲解ContentResolver的用法。
可用通过Context来获取ContentResolver的实例,在Activity中,可以直接使用下面这句:
- ContentResolver resolver = this.getContentResolver();
获取到该对象后,可实现如下一些常用的功能:
- //查询:
- public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
- //新增
- public final Uri insert(Uri url, ContentValues values)
- //更新
- public final int update(Uri uri, ContentValues values, String where, String[] selectionArgs)
- //删除
- public final int delete(Uri url, String where, String[] selectionArgs)
查询
- <strong>query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)</strong>
描述:根据指定的URI,返回一个游标结果集Cursor。为了提高性能,使用该方法最好能遵照以下的建议:1)对于返回结果,使用projection参数指定记录中包含的字段,以避免大量不用的字段被检索,浪费资源;2)在selection参数中使用类似phone=?的问号表达式来指定检索条件中的字段值,尽量不要使用指定值(比如phone='123'),这样有利于查询的系统缓存。
参数:
uri 表示用于获取什么内容的URI,比如通讯录为Phone.CONTENT_URI
projection 字段名称数组,比如要获取联系人的显示名称、电话号码、头像ID、联系人ID,则值为:
- new String[] { Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID }
selection 查询条件字符串,类似sql语句中的where子句,比如:display_name=? and number=?
selectionArgs 参数selection中问号(?)对应的参数值数组
sortOrder 对应sql语句的order by子句,如采用默认排序,值可传null值。
实例代码:实现查询指定用户(号码)发送到本机的短信信息
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class ContentResolverActivity extends Activity {
private Button start;
//查询手机全部短信
final String SMS_URL_ALL="content://sms/";
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_contentresolver);
start=(Button) findViewById(R.id.start);
start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//查看手机短信
ContentResolver resolver = getContentResolver();
//查询返回数据数据
String[] projection=new String[]{"body","date"};
//查询条件
String selection=new String("address=?");
//匹配查询条件的值----待定
String[] selectionargs=new String[]{"+8618673109540"};
//是否排序操作
String sortOrder="date desc";
//地址解析
Uri uri = Uri.parse(SMS_URL_ALL);
//游标实例化
Cursor cursor=resolver.query(uri, projection, selection, selectionargs, sortOrder);
//数据查询
if(cursor.moveToFirst()){
String smsbody;
String date;
int smsbodyColumn=cursor.getColumnIndex("body");
int dateColumn=cursor.getColumnIndex("date");
do{
//信息内容
smsbody=cursor.getString(smsbodyColumn);
//信息接收时间
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyy-MM-dd hh:mm:ss");
Date d = new Date(Long.parseLong(cursor.getString(dateColumn)));
date = dateFormat.format(d);
Toast.makeText(ContentResolverActivity.this, "信息内容:"+smsbody+",接收时间:"+date, Toast.LENGTH_LONG).show();
System.out.println("信息内容:"+smsbody+",接收时间:"+date);
}while(cursor.moveToNext());
}
//游标关闭
cursor.close();
}
});
}
}