一:Cursor到底是什么?

网上很多博客都介绍了Cursor,介绍了各种概念,各种原理。可是有的小伙伴可能还是很懵逼,这特码的到底都是什么。

刚开始接触Cursor的时候也是一脸懵逼,看到人家说这个方法是在干什么干什么,可以脑子里没有一个生动形象的动作过程就感觉理解不了。Cursor是什么呢?是游标,可能有的小伙伴不知道什么是游标,看下图。


OK了吧,是不是OK了,光标是什么意思还用解释吗,我们在输入信息的时候能看到的那个一闪一闪的短线,那不就是光标吗,所以呢,我们也可以把游标理解成这个一闪一闪的短线。


二:我们是怎么获得Cursor对象的呢?


一般情况下:

SQLiteDataBase db;

Cursor cursor = db.query(各种参数);

这时,就出现了网上的解释了,说cursor是每行的集合。

每行的集合....

每行的集合....

每行的集合....

其实开始看到这几个字的时候我是认为我理解的,可是继续一寻思,可能就会有这种疑惑,它是把一行中的所有内容装到集合中呢,还是把所有行装到一个集合中啊,而且这个行是什么啊等等一系列小白问题。

现在先解释一下SQLite数据库中是怎么存放数据的,是以表的形式存放的,看这个表Student。




这里的id,name,age,gender,school,city就是列名,name这一列下面就对应着一个对象的name属性。所以我们能看到,一行的意思就是我们存放的一个对象了,比如张三这一行,名字是张三,在年龄这一列上是5,那么这个name属性为张三的对象,它的age的属性就为5。

所以这个每行的集合的意思,是获得的满足条件(就是我们query方法中传入的条件参数)的所有行。

比如我要在这个表中找gender为男的,那么获得到的cursor就包含了张三行,赵六行,孙七行。


三:我在遍历cursor内容的时候,为什么要先moveToFirst()?


我们采用反证法,我们不进行moveToFirst()操作,我们获取游标对象后,直接输出它当前的position值




可以看到,直接输出的position的值是-1,也就相当于我们刚开始获得它的时候,它是在第0行上面闪动呢。


所以我们使用moveToFirst后在输出position就会发现position=0了,使用moveToNext也可以。


四:moveToNext如何得知是否已经遍历完毕呢?


我们翻看源码,会发现moveToFirst,moveToNext,moveToLast,moveToPrevious等最后都会执行到这个方法


图中说的:这个对象在初始化的时候,指的就是当前页面的那个对象。mPos=-1被写在一个空参构造方法里了。

看源码的时候也能发现:

moveToFirst调用的是moveToPosition(0)

moveToNext调用的是moveToPosition(mPos+1)

所以如果是第一次调用的话,这两句话的意思是一样的(开始mPos=-1)。




更多相关文章

  1. 2016年末,Android岗位BAT等大厂面试题知识点小结(一)Android基础部
  2. Android监听ListView停止的时候是不是滑动到底部
  3. Android内存溢出整理总结
  4. [Android] Android开发优化之——从代码角度进行优化
  5. Android(安卓)用户界面---拖放(Drag and Drop)
  6. 面试时的那些坑之内存泄漏和内存溢出
  7. Evenbus思想解决切换网络高级处理(高级篇)
  8. android 将对象存储于本地(内存)
  9. Android(安卓)内存优化篇 - 使用profile 和 MAT 工具进行内存泄

随机推荐

  1. 完美解决listView滚动条隐藏的问题!
  2. 拥抱 Android Studio 之一:从 ADT 到 Andr
  3. 【魔幻塔防】60关配置文件
  4. ch020 Android SQLite3(第二部分)
  5. 对话框大合集
  6. Android录音实现——使用AtudioRecord
  7. Android Studio学习之-控件总结
  8. Android实现根据条件自动转换手机震动和
  9. Android应用安全之Android平台上的跨应用
  10. android:taskAffinity && android:allowT