为了说明在Android上使用共享内容提供器的能力,一个示例是使用它们可以很容易的创建一个类似的图像库应用程序。由于内容提供器(当前为MediaStore)在应用程序之间共享,因此为了使得我们自己的应用程序可以查看图像,实际上不需要创建一个摄像头应用程序并采取方法来存储图像。由于大多数应用程序将使用默认的MediaStore,因此可以利用它来建立我们自己的图像库应用程序。
从MediaStore中选择非常的简单。可以使用用于创建新纪录相同Uri来从中选择记录。
Media.EXTERNAL_CONTENT_URI
MediaStore和所有的内容提供器都以类似数据库的方式运作。从他们中选择记录,获得一个Cursor对象,并通过它来遍历结果。
为了实现选择,首先需要创建一个想要返回的列的字符串数组。对于MediaStore中的图像,其标准列在MediaStore.Images.Media类中表示。
String []columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME};
为了执行实际查询,可以使用活动managedQuery方法。第一个参数是Uri,随后是列名称的数组,后跟一条限定的WHERE子句和WHERE子句的任何参数,最后是一条ORDER BY 子句。
以下将选择在最近一个小时内创建的记录,并按照从远到近的顺序对他们进行排序。
首先创建一个称为oneHourAgo的变量,该变量将存储从1970年1月1日到一小时前所经过的秒数。System.currentTimeMillis()将返回相同日期以来的毫秒数,所以除以1000将获得秒数。如果减去60分X60秒,那么将获得一个小时前的值。
String [] whereValues={""+oneHourAgo};
然后,选择想要返回的列。
String []columns={Media.DATA,Media._ID,Media.TITLE,Media.DISPLAY_NAME,Media.DATE_ADDED};
最后执行该查询。WHERE子句中有一个“?”,它将会被下一个参数中的值所替换。如果存在多个“?”,那么在传入的数组中必须有多个值。这里使用ORDER BY 子句指定返回的数据将以添加的日期升序排列。
cursor=managedQuery(Media.EXTERNAL_CONTENT_URI, columns, Media.DATE_ADDED+">?", whereValues, Media.DATE_ADDED+"ASC")
当然如果希望返回所有的记录,那么可以对后面的3个参数传入null值。
Cursor cursor=managedQuery(Media.EXTERNAL_CONTENT_URI, columns,null, null, null);
返回的游标会告诉我们当前选择的每个列的索引。
displayColumnIndex=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
为了从游标中选择字段,需要使用此索引。首先通过moveToFirst方法,确保游标是有效的并包含一些结果。如果游标不包含任何结果,那么该方法将返回false。我们使用Cursor类中的几种方法之一来选择实际的数据。选择的方法取决于数据的类型,例如getString用于字符串,getInt用于整数等。
1 if(cursor.moveToFirst()){ 2 String displayName=cursor.getString(displayColumnIndex); 3 }