原创链接: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.
*
*
This method will return false if the cursor is empty.
*
* @return whether the move succeeded.
*/
这是moveToFirst()的源码注释,是一个boolean值,如果是空(查询不到结果,与null区分)返回false,所以moveToFirst也可以当作判断条件。