当前位置: 首页 > news >正文

江苏建设厅网站查询wordpress 自动评论

江苏建设厅网站查询,wordpress 自动评论,网上申请营业执照入口,织梦映像Cursor这个类是Android开发者难以避免的#xff0c;比如数据库、ContentResolver内容的读取#xff0c;但通过这个类读取内容非常的繁琐#xff0c;针对要读取的每一个字段都会有这样一段代码#xff1a; int idIndex cursor.getColumnIndex(id); //获取字段…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(long id, String data, long size, String displayName, String mimeType, long dateAdded, long dateModified, long bucketId, String bucketDisplayName, int height, int width, String album, int orientation) {this.id id;this.data data;this.size size;this.displayName displayName;this.mimeType mimeType;this.dateAdded dateAdded;this.dateModified dateModified;this.bucketId bucketId;this.bucketDisplayName bucketDisplayName;this.height height;this.width width;this.album album;this.orientation orientation;}public SystemMedia() {}//省略 getter 和 setter }然后我们的查询代码就变成了 public void query(Context context) {try (Cursor cursor context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null,null, null, null)) {if (cursor ! null) {ListSystemMedia result new ArrayList();while (cursor.moveToNext()) {SystemMedia media (SystemMedia) CursorAdapter.withCursor(cursor, SystemMedia.CursorContract.class, SystemMedia::new);result.add(media);}}} }这样就结束了。 API说明 CursorAdapter.withCursor 方法 第一个Cursor参数目标Cursor对象第二个Class参数解构的合约接口需要是单方法的函数式接口类名和方法名随意该方法的参数需要使用Key注解第三个T参数合约接口的实现类完成由所有字段到对象的转换通常为全属性的构造方法的方法引用比如SystemMedia::new Key 注解 用于标注参数对应的字段名Cursor列名 完整实现差不多100行 其中用到的Memorizer工具见Java小技巧创建带缓存的过程 public abstract class CursorAdapterT {abstract T read(Cursor cursor, int index);public static T Object withCursor(Cursor cursor, ClassT clazz, T t) {ListPairInteger, CursorAdapter? list CursorAdapter.adapterExtractor.apply(cursor).apply(clazz);Method[] methods clazz.getMethods();if (methods.length 1) {Object[] args list.stream().map(pair - pair.first 0 ? pair.second.read(cursor, pair.first) : null).toArray();try {return methods[0].invoke(t, args);} catch (IllegalAccessException | InvocationTargetException e) {throw new RuntimeException(e);}} else {throw new IllegalStateException(methods length is not 1, current is methods.length);}}static final FunctionCursor, FunctionClass?, ListPairInteger, CursorAdapter? adapterExtractor Memorizer.weakMemorize(cursor - Memorizer.memorize(clazz - {Method[] methods clazz.getMethods();if (methods.length 1) {Method desMethod methods[0];Annotation[][] parameterAnnotations desMethod.getParameterAnnotations();Type[] parameterTypes desMethod.getGenericParameterTypes();if (parameterTypes.length parameterAnnotations.length) {ListPairInteger, CursorAdapter? adapterList new LinkedList();for (int i 0; i parameterTypes.length; i) {Type parameterType parameterTypes[i];OptionalPairInteger, CursorAdapter? pairOptional Arrays.stream(parameterAnnotations[i]).filter(annotation - annotation instanceof Key).map(annotation - (Key) annotation).findFirst().map(key - new Pair(cursor.getColumnIndex(key.value()), CursorAdapter.adapterBuilder.apply(parameterType)));if (pairOptional.isPresent()) {adapterList.add(pairOptional.get());} else {throw new IllegalStateException(every parameter must contains a Key annotation);}}return adapterList;} else {throw new IllegalStateException(parameters length is not equal to annotations length);}} else {throw new IllegalArgumentException(methods size must be 1, current is methods.length);}}));private static final FunctionType, CursorAdapter? adapterBuilder Memorizer.memorize(type - {if (int.class.equals(type) || Integer.class.equals(type)) {return create(Cursor::getInt);} else if (float.class.equals(type) || Float.class.equals(type)) {return create(Cursor::getFloat);} else if (long.class.equals(type) || Long.class.equals(type)) {return create(Cursor::getLong);} else if (short.class.equals(type) || Short.class.equals(type)) {return create(Cursor::getShort);} else if (String.class.equals(type)) {return create(Cursor::getString);} else if (double.class.equals(type) || Double.class.equals(type)) {return create(Cursor::getDouble);} else if (type instanceof GenericArrayType) {Type componentType ((GenericArrayType) type).getGenericComponentType();if (byte.class.equals(componentType)) {return create(Cursor::getBlob);} else {throw new IllegalStateException(unsupported componentType: componentType);}} else {throw new IllegalArgumentException(unsupported type : type);}});private static T CursorAdapterT create(BiFunctionCursor, Integer, T reader) {return new CursorAdapterT() {OverrideT read(Cursor cursor, int index) {return reader.apply(cursor, index);}};} }
http://www.zqtcl.cn/news/873676/

相关文章:

  • 宜兴市做网站网站建设简讯
  • 点的排版设计网站音乐网站网页设计
  • 牛商网做网站的思路建设网站的机构
  • flash网站制作实例自适应网站做百度推广
  • 深圳建立网站电影里的做视频在线观看网站
  • 国家建设标准发布网站在哪里在线教育网站怎样建设
  • 徐州 商城网站设计winserver wordpress
  • 做网络课程的网站一般网站的架构
  • 网站建设包含哪些内容句容住房和城乡建设局网站
  • 做网站是做完给钱还是新房装修图片
  • 阿里云建站视频wordpress显示摘要插件
  • 济宁网站建设 企业谷网站开发有什么用
  • 网站建设一般多少钱官网代做网站公司哪家好
  • 页面简洁的网站深圳广告宣传片拍摄
  • 做外卖网站青岛助创网络科技有限公司
  • 怎么选择优秀的网站建设公司建设银行宁波分行 招聘网站
  • 工艺品网站模板下载-古色古香建站软件排名
  • 微视频网站源码网站建设目标个人博客dw
  • 山西省建设厅入晋备案网站洛阳网站在哪备案
  • 可以做物理试验的网站有哪些仿微博网站模板
  • 网站横幅怎做网站到期不想续费
  • 黑龙江网站备案管理局济南网站建设策划
  • 网站怎么静态化网页设计与制作图片显示不出来
  • 市场营销推广策划方案网站如何做标题优化
  • 怎么让客户做网站手机网站如何优化
  • 柳州市住房和城乡建设局网站首页赣州章贡区人口
  • 有偷菜餐厅城市建设的网站好的手机网站
  • 做进行网站推广赚钱互联网企业信息服务平台
  • 微信公众号做视频网站吗百度账号登录入口网页版
  • 北京建设银行纪念钞预定官方网站撤销网站备案申请书