android 从两个游标获取数据,其中一个游标按日期排序

标签 android android-contentprovider

我想在一个按日期排序的 listView 中显示通话记录和收件箱消息中的电话号码。我使用两个光标;第一个检索调用,第二个检索传入消息。其中两个按日期排序。但我首先填充联系人,然后填充消息。 如何使用按日期排序的联系人和消息填充此列表?

这是我的代码:

    public static List<Call> getCallHistory() {
    boolean filter = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE).getInt("filter", 0) == 1;
    String[] strFields = { CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.CACHED_NAME, CallLog.Calls.TYPE, CallLog.Calls.DATE,
            CallLog.Calls.DURATION };
    String strOrder = CallLog.Calls.DATE + " DESC";
    final Cursor cursorCall = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, strFields, null, null, strOrder);

    List<Call> callList = new ArrayList<Call>();

    while (cursorCall.moveToNext()) {
        Call call = new Call();
        call.setNumber(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.NUMBER)));
        if (cursorCall.getInt(cursorCall.getColumnIndex(CallLog.Calls.TYPE)) == CallLog.Calls.OUTGOING_TYPE) {
            call.setOut(true);
        } else {
            call.setOut(false);
        }

        call.setName(cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME)));
        call.setTime(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DATE)));
        call.setDuration(cursorCall.getLong(cursorCall.getColumnIndex(CallLog.Calls.DURATION)));

        if (filter && cursorCall.getString(cursorCall.getColumnIndex(CallLog.Calls.CACHED_NAME)) != null) {
            continue;
        }
        callList.add(call);
    }
    cursorCall.close();
    return getMessageHistory(callList);
    // return callList;
}

public static List<Call> getMessageHistory(List<Call> callList) {
    String[] projection = { "address", "date", "body" };
    String sortOrder = "date DESC";
    Cursor cursor = context.getContentResolver().query(SMS_INBOX_CONTENT_URI, projection, null, null, sortOrder);
    while (cursor.moveToNext()) {

        Call call = new Call();
        call.setNumber(cursor.getString(cursor.getColumnIndex("address")));
        call.setTime(cursor.getLong(cursor.getColumnIndex("date")));
        call.setBody(cursor.getString(cursor.getColumnIndex("body")));
        call.setSms(true);

        callList.add(call);
    }
    return callList;
}

最佳答案

您应该使用 Android MergeCursor ,它就是为了这个目的而创建的。

在你的情况下类似

Cursor cursorCall = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, strFields, null, null, strOrder);
Cursor cursorInbox = context.getContentResolver().query(SMS_INBOX_CONTENT_URI, projection, null, null, sortOrder);
Cursor merged = new MergeCursor(new Cursor[] { cursorCall, cursorInbox });

如果列不匹配导致问题,您可以使用CursorWrapper对齐它们。

关于android 从两个游标获取数据,其中一个游标按日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20820004/

相关文章:

对于来自市场的安装,Android Market 安装引荐来源网址为空。这是错误还是正常行为?

android - 更新与多号码 android 的现有联系人

android - 在 ContentProvider 中访问上下文

android - 如何从另一个 Activity 或另一个线程触摸 EditTextPrefences

android - 如何使用存储访问框架android将文件保存到下载文件夹?

android - react-native编译错误: The SDK Build Tools revision is too low for project

android - 清除我的 Android 应用程序中任何 Activity 的通知

Android UriMatcher 不匹配通配符

android - 如何从线程表中的 recepient_ids 中获取联系方式

android - Firefox for Android 内容提供商?