(android 基础知识之数据存储) ContentResolver

来源:互联网 发布:烈焰遮天全套完整源码 编辑:程序博客网 时间:2024/05/20 15:36

     当应用程序需要与别的应用进行交互时,需要使用Android提供的两个类,ContentProvider和ContentResolver来实现相关功能。ContentProvider用来提供内容给别的应用来操作,ContentResolver用来操作(包括查询、插入等)别的应用数据,当然在自己的应用中也可以。 本着重讲解ContentResolver的用法。

        可用通过Context来获取ContentResolver的实例,在Activity中,可以直接使用下面这句:

[java] view plaincopy
  1. ContentResolver resolver = this.getContentResolver();    

         获取到该对象后,可实现如下一些常用的功能:

[java] view plaincopy
  1. //查询:     
  2. public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);     
  3. //新增     
  4. public final Uri insert(Uri url, ContentValues values)         
  5. //更新     
  6. public final int update(Uri uri, ContentValues values, String where, String[] selectionArgs)     
  7. //删除     
  8. public final int delete(Uri url, String where, String[] selectionArgs)  

        查询

[java] view plaincopy
  1. <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,则值为:

[java] view plaincopy
  1. 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/";@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.layout_contentresolver);start=(Button) findViewById(R.id.start);start.setOnClickListener(new OnClickListener(){@Overridepublic 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();}});}}


 

原创粉丝点击