Android呼叫日志上的查询会跳过第一条记录

时间:2015-04-21 14:43:41

标签: android database cursor call calllog

我正在尝试使用以下代码获取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;

对于大多数调用,这是有效的,除了顶部调用(最新的,因为我按日期排序,降序)。

怎么会这样?

2 个答案:

答案 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
}