我正在尝试使用以下代码获取android调用日志中的所有调用:
ArrayList<Call> list = new ArrayList<Call>();
Cursor cursor;
// The fields we want to select from the internal database. Setting this
// to null is equivalent to * (e.g., SELECT * FROM...)
String[] projection = {CallLog.Calls.NUMBER, CallLog.Calls.DATE, CallLog.Calls.TYPE};
String sortOrder = CallLog.Calls.DATE + " desc";
int numberCol = 0;
String contactName;
String contactNumber;
String contactDate;
int callType;
Call phone_call;
// Query the CallLog table, selecting only the number and date then sorting it by the date.
cursor = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, sortOrder);
numberCol = cursor.getColumnIndex(CallLog.Calls.NUMBER);
if(cursor.moveToFirst()) {
while(cursor.moveToNext()) {
//do stuff
}
}
cursor.close();
return list;
对于大多数调用,这是有效的,除了顶部调用(最新的,因为我按日期排序,降序)。
怎么会这样?
答案 0 :(得分:3)
cursor.moveToFirst()
将移至第一行。到现在为止还挺好。但是那时你正在做
while(cursor.moveToNext()) {
}
再次移动光标,这次是下一行,即第二行,从而跳过第一行。
答案 1 :(得分:1)
Melquiades对您的问题的来源是正确的,但是您的解决方案存在问题。 SQLiteDatabase.query位于第一个元素之前,这就是你的while循环正在工作的原因,但是你没有检查查询返回的游标是否包含任何元素。
这是一个片段,它既检查空光标又不跳过第一个元素。
if (cursor.moveToFirst()) {
do {
// Handle each element of the query
} while (cursor.moveToNext())
} else {
// cursor contains no results
}