似乎

android.database.Cursor.getColumnIndex(String)应该在行循环中不变.

然而,我看到大量代码执行以下操作:try (Cursor cursor = database.query(...)) {

while (cursor.moveToNext()) {

String aString = cursor.getString(cursor.getColumnIndex(aColumnName));

// ... other loop code and more repeated use of getColumnIndex()

}

}

这看起来很愚蠢和浪费,除非getColumnIndex()的结果真的随着对cursor.moveToNext()的调用而变化 – 而且这个调用应该从循环中提升出来,如:try (Cursor cursor = database.query(...)) {

int aStringIdx = cursor.getColumnIndex(aColumnName);

while (cursor.moveToNext()) {

String aString = cursor.getString(aStringIdx);

// ... other loop code

}

}

或者在最坏的情况下(假设getColumnIndex()要求您在有效的数据行上):try (Cursor cursor = database.query(...)) {

if (cursor.moveToFirst()) {

int aStringIdx = cursor.getColumnIndex(aColumnName);

do {

String aString = cursor.getString(aStringIdx);

// ... other loop code

} while (cursor.moveToNext());

}

}

那么这里的真实故事是什么?

最佳答案I was seeing all did getColumnIndex each time through the row loop, which made no sense at all

也许是因为当我们执行查询时,我们收到一个SQLiteCursor实例,而不是AbstractCursor.如果我们查看源代码,我们可以在内部找到chache:@Override

public int getColumnIndex(String columnName) {

// Create mColumnNameMap on demand

if (mColumnNameMap == null) {

String[] columns = mColumns;

int columnCount = columns.length;

HashMap map = new HashMap(columnCount, 1);

for (int i = 0; i < columnCount; i++) {

map.put(columns[i], i);

}

mColumnNameMap = map;

}

//...

}

另一方面,访问变量(如示例2)比计算哈希键以获取索引更快.可能是相关的,取决于表的大小.

编辑:在具有复杂查询的大型表上进行测试,似乎改进了5%,在我的情况下不值得进行更改.通常,HashMap缓存足够好.

android cursor循环,Android:Cursor.getColumnIndex()在行循环中是不变的吗?相关推荐

  1. android cursor 实例化,为什么Cursor放到带参数带返回值方法里就报错?

    完整代码如下: 其中有大部分的代码被注释,那是可以成功运行的. 后来我想啊,游戏有好多种,但是需要统计的内容是一样的. 我就想传参 然后获得返回值的方式 来减少代码量啊. 但是把相关的查询代码放到 带 ...

  2. android双重for循环,Android实现ViewPager无限循环效果(二)

    本文实例为大家分享了Android实现ViewPager无限循环效果的第二种方式,供大家参考,具体内容如下 原理:在Adapter中将getCount设置为无限大 package com.xiaoma ...

  3. android定时循环,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  4. PLSQL 循环游标 cursor loop fetch into

    PLSQL 循环游标 cursor 的一点心得体会 set serveroutput on---------------打印输出信息,默认是FALSE declare ---------------- ...

  5. 打造一个丝滑般自动轮播无限循环Android库

    作者:一包纯牛奶 链接: https://juejin.im/post/5d6bce24f265da03db0790d1 本文由作者授权发布. 这里我把作者两篇文章合体了,主要是为了在项目功能介绍的基 ...

  6. android高仿京东快报(垂直循环滚动新闻栏)

    的android高仿京东快报(垂直循环滚动新闻栏) 标签: 机器人 2016年3月20日03:08 2676阅读人 评论(15)收藏举报    分类: 机器人(71)  版权声明:本文为博主原创文章, ...

  7. android alarmmanager后台,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  8. android 从左向右平移_Android实现循环平移动画示例

    实现用一张背景图做循环从左往右平移动画. 1.实现两个animation xml文件,一个起始位置在-100%p ,一个在0%p.设置repeat属性为循环,重复. android:repeatMod ...

  9. android progressbar 循环,Android ProgressBar消失

    我有一个不确定的android progressbar,所以它只是一个循环动画. 它开始显示很好,但是在我设置了它的父对象的可见性之后( overlayLayout )若要消失或不可见,然后稍后将其设 ...

  10. android游戏开发_Android游戏开发–游戏循环

    android游戏开发 游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是whi ...

最新文章

  1. 【模型评估与选择】sklearn.model_selection.KFold
  2. ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
  3. 华为全面屏鸿蒙,华为P50pro最新确认:麒麟1020+立体全面屏+鸿蒙系统,这才是华为...
  4. 网页游戏 服务器 性能测试工具,简单的压力测试工具
  5. 海量数据处理分析(部分)
  6. 进程共享变量#pragma data_seg用法
  7. java lambda::_书评:精通Lambda:多核世界中的Java编程
  8. RecyclerView滑动到底部自动加载
  9. python知识点查阅
  10. notepad++格式化插件安装
  11. css线条伸缩_CSS3弹性伸缩布局(一)——box布局
  12. java迷宫算法继承_求Java关于迷宫的算法(用栈实现)
  13. 【UV打印机】RYPC打印软件教程(一)-软件简介
  14. 怎么做阿里巴巴国际站的测评?需要哪些技术?
  15. 字节跳动的“飞阅会”开会模式:先笔谈 后PK 直接生成会议纪要
  16. 帝国cms安装 mysql支持错误_帝国CMS安装时 mysql出错。
  17. Contiki教程——进程
  18. 磁盘与文件系统管理--鸟哥私房菜读书笔记
  19. 深度学习之残差网络原理深度刨析
  20. 用51单片机中断控制LED灯亮灭

热门文章

  1. 电影《冰川时代3》用Sun刀片服务器渲染
  2. 《视觉SLAM十四讲》-第五章第1节-1-“相机与图像”-“相机模型”-“针孔相机模型”-学习笔记总结
  3. 8有价值的电子商务网站设计要点
  4. OA流程 工作流设计
  5. VCS/Questa SIM 使用流程及Makefile
  6. 打开excel很慢的解决方法
  7. 【NOIP practice】BSOJ 3132 卡扎菲 并查集
  8. 为泄愤程序员攻击北京摇号网站昨受审 曾为市高考状元
  9. 计算机用户文件夹加密,windows7电脑文件夹怎么加密
  10. C语言指数函数应用pow n次方