这几天自己在做一个小的图库项目,使用到了Android系统提供的MediaStore.Image数据库。在查询的时候发现有的时候需要去除相同项,有的时候需要通过外键查询缩略图的表。但是通过ContentResolver的query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder);很难直接做到这一点,找了很久也找不到解决办法,最后还是灵光一现,想出了一个字符串拼接的方法。一下就是此方法的实现:
package com.zzy.cloudpic.dao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import com.zzy.cloudpic.bean.CoverInfo;
import com.zzy.cloudpic.bean.ImageInfo;
import com.zzy.cloudpic.bean.ThumbInfo;
public class MediaStoreDao {
public final static String[] IMAGE_INFO = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.ORIENTATION, MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media.DATE_MODIFIED, MediaStore.Images.Media.DATE_TAKEN,
MediaStore.Images.Media.LATITUDE, MediaStore.Images.Media.LONGITUDE,
MediaStore.Images.Media.DATA, MediaStore.Images.Media.MIME_TYPE,
MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.TITLE };
public final static String[] THUMB_INFO = { MediaStore.Images.Thumbnails._ID,
MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.KIND, MediaStore.Images.Thumbnails.WIDTH,
MediaStore.Images.Thumbnails.HEIGHT };
//此处在需要查询的属性前面拼接上 distinct去除相同项
public final static String[] COVER_INFO = { "distinct "
+ MediaStore.Images.Media.BUCKET_DISPLAY_NAME };
/**
* 查询图片信息
*
* @param context
* 上下文信息
* @param uri
* 数据库uri
* @param projection
* 需要查询的列名
* @param selection
* 查询条件
* @param selectionArgs
* 占位符信息
* @param sortOrder
* 排序
* @return
*/
public static Map queryImageInfo(Context context, Uri uri,
String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// 用来保存ImageInfo信息,以image_id为key
Map map = new HashMap();
ImageInfo imageInfo = null;
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
imageInfo = new ImageInfo();
imageInfo.setId(cursor.getInt(0));
imageInfo.setOrientation(cursor.getInt(1));
imageInfo.setDate_add(cursor.getLong(2));
imageInfo.setDate_modified(cursor.getLong(3));
imageInfo.setDate_taken(cursor.getLong(4));
imageInfo.setLatitude(cursor.getDouble(5));
imageInfo.setLongitude(cursor.getDouble(6));
imageInfo.setData(cursor.getString(7));
imageInfo.setMime_type(cursor.getString(8));
imageInfo.setDisplay_name(cursor.getString(9));
imageInfo.setParent_name(cursor.getString(10));
imageInfo.setTitle(cursor.getString(11));
map.put(imageInfo.getId(), imageInfo);
}
cursor.close();
return map;
}
/**
* 查询缩略图信息
*
* @param context
* 上下文信息
* @param uri
* 数据库uri
* @param projection
* 需要查询的列名
* @param selection
* 查询条件
* @param selectionArgs
* 占位符信息
* @param sortOrder
* 排序
* @return
*/
public static List queryThumbInfo(Context context, Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
// Map map = new HashMap();
List list = new ArrayList();
ThumbInfo thumbInfo = null;
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
thumbInfo = new ThumbInfo();
thumbInfo.setId(cursor.getInt(0));
thumbInfo.setData(cursor.getString(1));
thumbInfo.setImage_id(cursor.getInt(2));
thumbInfo.setKind(cursor.getInt(3));
thumbInfo.setWidth(cursor.getInt(4));
thumbInfo.setHeight(cursor.getInt(5));
// map.put(thumbInfo.getImage_id(), thumbInfo);
list.add(thumbInfo);
}
cursor.close();
return list;
}
/**
* 在Android中系统提供了两张表来存储SD卡中的图片信息,分别是images(图片的信息)和thumbnails(图片的缩略图信息)
* 分别使用MediaStore.Image. Media和MediaStore.Image.Thumbnails来操作,以image_id为外键
* 。这里在images表有一个字段
* bucket_dispaly_name是图片所在的文件夹,也就是图片所在的相册。CoverInfo封装了属于同一个相册的所有图片的信息
* ,包括缩略图。这里查询就需要使用到distinct取出相同项和外键查询thumbnails表
*
* @param context
* 上下文信息
* @param uri
* 数据库uri
* @param projection
* 需要查询的列名
* @param selection
* 查询条件
* @param selectionArgs
* 占位符信息
* @param sortOrder
* 排序
* @return
*/
public static List queryCoverInfo(Context context, Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
List list = new ArrayList();
CoverInfo coverInfo = null;
ContentResolver cr = context.getContentResolver();
// 首先在image表中查询出相册,因为可能有的很多图片在同一个文件夹下,也就是在同一个相册,此处就需要使用distinct去除相同项
Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
while (cursor.moveToNext()) {
coverInfo = new CoverInfo(cursor.getString(0));
// select为sql语句查询的where部分,此处为外键查询的关键,整个的意思就是:
// where image_id in (select _id from images where_bucket_display_name='covername')
String where = MediaStore.Images.Thumbnails.IMAGE_ID
+ " in (select _id from images where "
+ MediaStore.Images.Media.BUCKET_DISPLAY_NAME + "='" + coverInfo.getName()
+ "')";
coverInfo.setThumbList(MediaStoreDao.queryThumbInfo(context,
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, MediaStoreDao.THUMB_INFO,
where, null, null));
list.add(coverInfo);
}
cursor.close();
return list;
}
}