Cursor的moveToFirst和moveToNext

最近项目中用到很多查询数据的地方,都用到了Cursor,但是对Cursor的moveToFirst和moveToNext用法却有些疑惑,总感觉可以先用moveToFirsrt来判断查询结果是否为空,然后再用moveToNext的while循环来逐条读取数据,我也不知道最初我这种想法从何而来,似乎是这样想的,当用ContentProvider查询得到一个cursor的时候,cursor应该是处于指向第一条记录的位置,因此调不调用moveToFirst都是一样的。可是后来写着写着就觉得矛盾了,如果真的是得到的cursor就指向第一条,那么不调用moveToFirst,直接使用while(moveToNext())的循环岂不是把第一条给跳过去了?

越想越糊涂,还是直接看代码,又写了个例子debug了一下,原来查询得到的cursor是指向第一条记录之前的,因此查询得到cursor后第一次调用moveToFirst或moveToNext都可以将cursor移动到第一条记录上。

源码中这些moveXXX其实都是通过moveToPosition来实现的,而记录position的是一个整型变量mPos。当moveXXXX返回false的时候,mPos会被置为-1,也就是回到了初始状态,指向第一条记录之前。

这里记录一下自己犯下的这个错误。

时间: 2024-10-13 11:49:49

Cursor的moveToFirst和moveToNext的相关文章

cursor 的moveToFirst和moveToNext和moveToPrevious以及moveToLast

查询出来的cursor的初始位置是指向第一条记录的前一个位置的,cursor.moveToFirst()指向查询结果的第一个位置.一般通过判断cursor.moveToFirst()的值为true或false来确定查询结果是否为空.cursor.moveToNext()是用来做循环的,一般这样来用:while(cursor.moveToNext()){ } cursor.moveToPrevious()是指向当前记录的上一个记录,是和moveToNext相对应的: cursor.moveToLa

20160112

3.Gradle整改编译体制http://stormzhang.com/devtools/2014/12/18/android-studio-tutorial4/4.android开发的可以看下这个人的博客,性能优化方面很全面.http://hukai.me/android-dev-patterns/6.广播中添加permissionhttp://blog.csdn.net/shineflowers/article/details/404263617.file.getPath() getAbso

Android数据存储之SQLite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,占用资源非常少,只有几百KB内存.支持Windows/Linux/Unix等等主流的操作系统,同时能够跟其他程序语言相结合,比如 Tcl.C#.PHP.Java等,还有ODBC接口,同样比起Mysql.PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快.SQLite是当前使用最广泛的数据库,基于以上优点,Android系统采用SQ

Android学习(五)

学号 20189214 <Java程序设计>第十周学习总结 教材学习内容总结 偏好 在sharedPreferences包含一个键值对,可以使用contains方法,来判断指定的键是否存在.可以使用getAll方法对所有的键值对获取为一个Map. SettingFragment类是PreferenceFragment类的一个子类.它是一个简单的类,直接调用了addPreferences FromResource方法来加载3个Preference子类的布局xml文档. 操作文件 Android设

读取短信数据库放到ListView中显示

在布局文件中加入ListView布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="

android——SQLite数据库存储(操作)

1 public class MyDatabaseHelper extends SQLiteOpenHelper { 2 3 //把定义SQL建表语句成字符串常量 4 5 //图书的详细信息 6 //ID.作者.价格.页数.书名 7 public static final String CREATE_BOOK = "create table Book(" 8 +"id integer primary key autoincrement," 9 +"auth

LoaderManager的使用

在数据库操作中,只有查询是比较难的,因为这个操作数据过多的话很可能会造成主线程阻塞.以前我总是把查询数据的方法放在新开的子线程中来进行,今天发现了一个好方法. 并且这个方法不管在Acitivity里还是在Fragment都很好用. 首先呢要声明一个LoaderManager对象, 然后要初始化LoaderManager,第一个参数id,可以随便写,第二个参数是可选项,第三个是回调方法 然后需要实现callback接口public class MainActivity extends Activi

SQLite cursor.moveToNext()

cursor.moveToNext()会出异常,如下 E/AndroidRuntime( 2249): FATAL EXCEPTION: Thread-49 E/AndroidRuntime( 2249): java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.E/AndroidRuntime( 2249): at android.dat

cursor.moveToNext()不执行,直接执行cursor.close

问题: 觉得明明有传值到dbManager中,可是cursor.moveToNext()不执行,直接执行cursor.close,如图: 我这边传过来的是branch,branch传过来的值是"佛祖",在执行到cursor这里的时候,在数据库中没找到branch为"佛祖"的数据,所以while循环的语句就不会执行了,会直接执行cursor.close(); 错误原因: 解决: 以为branch传过来的时候有值,就以为数据库中有这条数据,其实并没有.此时就可以测试一下