Cursor
这个类是Android开发者难以避免的,比如数据库、ContentResolver内容的读取,但通过这个类读取内容非常的繁琐,针对要读取的每一个字段都会有这样一段代码:
int idIndex = cursor.getColumnIndex("id"); //获取字段对应的列index(列index通常并不需要每次都获取)
if(idIndex >= 0){
//判断列index的合法性
String id = cursor.getString(idIndex); //获取对应列的内容
}
这种代码基本没法复用,而且还都是纯手工代码,自动生成比较麻烦,我希望可以像用json映射那样,每个字段/列一行代码就完成这个任务,所以本文就仿照以前解构Bundle
一样,来解构Cursor
(完整实现差不多100行)。
实现效果
以MediaStore
读取照片为例,先编写内容要映射到的Java数据类(重点在于其中的CursorContract
):
public class SystemMedia implements Serializable {
private long id;
private String data;
private long size;
private String displayName;
private String mimeType;
private long dateAdded;
private long dateModified;
private long bucketId;
private String bucketDisplayName;
private String album;
private int height;
private int width;
private int orientation;
public interface CursorContract {
//重点:这个类声明映射的合约,需要提供一个同样参数的构造方法以方便使用
SystemMedia consume(@Key(MediaStore.MediaColumns._ID) long id,
@Key(MediaStore.MediaColumns.DATA) String data,
@Key(MediaStore.MediaColumns.SIZE) long size,
@Key(MediaStore.MediaColumns.DISPLAY_NAME) String displayName,
@Key(MediaStore.MediaColumns.MIME_TYPE) String mimeType,
@Key(MediaStore.MediaColumns.DATE_ADDED) long dateAdded,
@Key(MediaStore.MediaColumns.DATE_MODIFIED) long dateModified,
@Key(MediaStore.MediaColumns.BUCKET_ID) long bucketId,
@Key(MediaStore.MediaColumns.BUCKET_DISPLAY_NAME) String bucketDisplayName,
@Key(MediaStore.MediaColumns.HEIGHT) int height,
@Key(MediaStore.MediaColumns.WIDTH) int width,
@Key(MediaStore.MediaColumns.ALBUM) String album,
@Key(MediaStore.MediaColumns.ORIENTATION) int orientation);
}
public SystemMedia