cursor的遍历时moveToFirst和moveToNext的区别

问题:当时刚接触sqlite和contentProvider时候记得cursor初始位置不正确 所以要moveToFirst 才能使cursor正确指向第一个位置。那么问题来了,遍历的时候要用moveToNext(在我印象中是同时使用的),所以脑海中默认写法是这样:

        if (cursor!=null){
            try{
                cursor.moveToFirst();
                while(cursor.moveToNext()){
                    String address=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
                    Log.d(TAG, address);
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if (cursor!=null) {
                    cursor.close();
                }
            }
        }

但是这样并不对啊,这样把第一条结果略过了!那么为什么去掉moveToFirst()就正确了呢?

            try{
                //去掉moveToFirst
                while(cursor.moveToNext()){
                    String address=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
                    Log.d(TAG, address);
                }
            }

先看下面这段代码:

        Cursor cursor=contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,null,null,null);
        Log.d(TAG,"cursor初始位置"+cursor.getPosition());
        cursor.moveToFirst();
        Log.d(TAG,"movetofirst的位置"+cursor.getPosition()+"");
就是把初始位置和moveToFirst的位置记录一下,看logcat显示:
cursor初始位置-1
movetofirst的位置0

也就是说:cursor初始位置是在-1,而数据是从0开始的,所以cursor.moveToNext刚好是从-1变成0,不需要moveToFirst而是直接循环moveToNext就可以完成遍历。


钻下牛角尖:那我想两者一起用怎么办?其实也没什么难。

        if (cursor!=null && cursor.moveToFirst()){
                do {
                    String address = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
                    Log.d(TAG, address);
                } while (cursor.moveToNext());

 或者

            cursor.moveToFirst();
            while(!cursor.isAfterLast()){
                //dosomething
                cursor.moveToNext();
            }


/**

     * Move the cursor to the first row.
     *
     * <p>This method will return false if the cursor is empty.
     *
     * @return whether the move succeeded.
     */

这是moveToFirst()的源码注释,是一个boolean值,如果是空(查询不到结果,与null区分)返回false,所以moveToFirst也可以当作判断条件。


  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值