一: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)。