cursor的遍历时moveToFirst和moveToNext的区别

原创链接:https://blog.csdn.net/zx422359126/article/details/75944216

问题:当时刚接触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就可以完成遍历。

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

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

 或者

        if (cursor!=null && cursor.moveToFirst()){
                do {
                    String address = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
                    Log.d(TAG, address);
                } while (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也可以当作判断条件。

猜你喜欢

转载自blog.csdn.net/n_fly/article/details/106907389