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

java哥 阅读:689 2021-04-01 10:10:44 评论:0

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

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

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

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

[java]   view plain copy
  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 plain copy
  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 plain copy
  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/"; 
	@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(); 
			} 
			 
		}); 
	} 
}


 

标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号