Cómo ordenar una lista cursor dos diferentes?

Temuujin:

Quiero ordenar los resultados procedentes de dos cursores. Consideremos dos cursores diferentes de ser Cursory Cursor1.

Cursores de CallLog.Call.CONTENT_URIy Cursor1es de Telephony.Sms.CONTENT_URI.

El problema es de dos cursores lista combinada es la clasificación de dos maneras diferentes. Quiero ordenar esta lista combinada usando columnas de fecha. Perdón por mi mal ingles.

Aquí está mi LogManager.java

public List<CallLogModel> getLogs() {
        List<CallLogModel> logObjectList;
        logObjectList = new ArrayList<>();

        Cursor cursor = this.context.getContentResolver().query(CallLog.Calls.CONTENT_URI,null, null, null, CallLog.Calls.DATE + " DESC ");
        Cursor cursor1 = this.context.getContentResolver().query(Telephony.Sms.CONTENT_URI, null, null, null, Telephony.Sms.DATE + " DESC ");

        // ------ Call Log ------
        int number = Objects.requireNonNull(cursor).getColumnIndex("number");
        int type = cursor.getColumnIndex("type");
        int date = cursor.getColumnIndex("date");
        int duration = cursor.getColumnIndex("duration");
        // ------ Call Log end ------

        // ------ SMS Log ------    
        int smsDate = Objects.requireNonNull(cursor1).getColumnIndexOrThrow(Telephony.Sms.DATE);
        int smsNumber = cursor1.getColumnIndexOrThrow(Telephony.Sms.ADDRESS);
        int smsType = cursor1.getColumnIndexOrThrow(Telephony.Sms.TYPE);
        // ------ SMS Log end ------

        while(cursor.moveToNext() && cursor1.moveToNext()) {
            CallLogModel log = new CallLogModel(this.context);
            // ------ Call Log ------
            log.setNumber(cursor.getString(number));
            log.setType(cursor.getInt(type));
            log.setDuration(cursor.getInt(duration));
            log.setDate(cursor.getLong(date));
            // ------ Call Log end ------

            // ------ SMS Log ------ 
            log.setAddress(cursor1.getString(smsNumber));
            log.setSmsDate(cursor1.getLong(smsDate));
            log.setSmsType(cursor1.getInt(smsType));
            logObjectList.add(log);.
            // ------ SMS Log end ------
        }
        cursor.close();
        cursor1.close();
        return logObjectList;
    }
Mike:

Suponiendo que la fecha de la columna es un número entero (o una reconocida SQLite fecha y hora cadena SQL como se entiende por SQLite - Funciones de fecha y tiempo ), a continuación, basada en la información disponible la siguiente consulta subyacente puede hacer lo que quiera y los medios individuales conjunto de resultados que se tener un solo cursor.

WITH combined AS (SELECT * FROM Calls UNION SELECT address, type, date, 0 FROM SMS)
SELECT * FROM combined ORDER BY date DESC;

Este cosechadoras (hace una UNION ) ambas tablas (utilizando 0 como la duración de de SMS (unión requiere tanto para tener el mismo número de columnas, por lo tanto, la adición de 0) ) y las órdenes de la lista combinada de acuerdo con la columna de fecha.

Ejemplo

El seguimiento

  1. Elimina las mesas, si es que existen para la repetición-capacidad.
  2. Crea tablas (en base a las columnas que probablemente existe (nombres pueden ser diferentes))
  3. Cargas algunos datos en la tabla de llamadas.
  4. cargas algunos datos en la tabla SMS (con tiempos intercalados en los tiempos de llamada)
  5. Selecciona filas de cada tabla (con una columna adicional derivada que indica la fecha en un formato fácil de leer)
  6. Finalmente invoca la consulta como anteriormente.

: -

DROP TABLE IF EXISTS Calls;
DROP TABLE IF EXISTS SMS;
/*
        int number = Objects.requireNonNull(cursor).getColumnIndex("number");
        int type = cursor.getColumnIndex("type");
        int date = cursor.getColumnIndex("date");
        int duration = cursor.getColumnIndex("duration");
*/
CREATE TABLE IF NOT EXISTS Calls (number INTEGER, type INTEGER, date INTEGER, duration INTEGER);
/*
        int smsDate = Objects.requireNonNull(cursor1).getColumnIndexOrThrow(Telephony.Sms.DATE);
        int smsNumber = cursor1.getColumnIndexOrThrow(Telephony.Sms.ADDRESS);
        int smsType = cursor1.getColumnIndexOrThrow(Telephony.Sms.TYPE);
*/
CREATE TABLE IF NOT EXISTS SMS (address INTEGER, date INTEGER, type INTEGER);

INSERT INTO Calls VALUES
    (1000000001,100,strftime('%s','now','+1 minutes'),30),
    (1000000002,100,strftime('%s','now','+3 minutes'),30),
    (1000000003,100,strftime('%s','now','+4 minutes'),30),
    (1000000004,100,strftime('%s','now','+6 minutes'),30),
    (1000000005,100,strftime('%s','now','-7 minutes'),30)
;

INSERT INTO SMS VALUES
    (2000000011,strftime('%s','now','+2 minutes'),200) /* Should be between call 1 and call 2 */, 
    (2000000012,strftime('%s','now','-12 minutes'),200) /* Should be after call 1 (when sorted with DESC) */,
    (2000000013,strftime('%s','now','+5 minutes'),200) /* between call 3 and 4 */,
    (2000000014,strftime('%s','now','+6 minutes'),200) /* same as call4 ? may be before or after unless ORDER BY is more comprehensive */
;

SELECT *,datetime(date,'unixepoch') AS easytoreaddatetime FROM Calls;
SELECT *,datetime(date,'unixepoch') AS easytoreaddatetime FROM SMS;

/*<<<<<<<<<< THE QUERY >>>>>>>>>>*/
WITH combined AS (SELECT * FROM Calls UNION SELECT address, type, date, 0 FROM SMS)
SELECT *, datetime(date,'unixepoch') FROM combined ORDER BY date DESC;

resultados

1. La tabla de llamadas + fecha y hora en formato de fácil lectura

introducir descripción de la imagen aquí

2. La mesa de SMS + fecha y hora en formato de lectura fácil

introducir descripción de la imagen aquí

3. El, lista ordenada combinada

introducir descripción de la imagen aquí

  • Nota El SMS se resaltan filas (que comienzan con 2 no 1)
  • Un fácil leer datos y también se ha añadido a tiempo para la demostración.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333909&siteId=1
Recomendado
Clasificación