Como classificar uma lista diferente cursor dois?

Temuujin:

Quero classificar os resultados provenientes de dois cursores. Vamos considerar dois cursores diferentes de ser Cursore Cursor1.

Cursoré a partir CallLog.Call.CONTENT_URIe Cursor1é a partir Telephony.Sms.CONTENT_URI.

O problema é dois cursores lista combinada é classificar duas maneiras diferentes. Quero classificar esta lista combinada, que utilize colunas de data. Desculpe pelo meu mau Inglês.

Aqui é a minha 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:

Assumindo que a data da coluna é um inteiro (ou um reconhecido SQLite datetime cadeia de SQL como entendido por SQLite - Data e funções de tempo ), em seguida, com base na informação disponível a consulta subjacente a seguir pode fazer o que quiser e os meios único conjunto de resultados que lhe ter um único cursor.

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

Isto combina (faz uma UNIÃO ) ambas as tabelas (usando 0 como a duração do SMS (união requer tanto a ter o mesmo número de colunas, daí a adição de 0) ) e as ordens a lista combinada de acordo com a coluna de data.

Exemplo

Os seguintes

  1. Exclui as tabelas se elas existem para repetição-capacidade.
  2. Cria tabelas (com base nas colunas que provavelmente existe (nomes podem muito bem ser diferente))
  3. Cargas alguns dados na tabela de chamadas.
  4. carrega alguns dados na tabela de SMS (com tempos intercaladas nos tempos de chamada)
  5. Seleciona as linhas de cada tabela (com uma coluna extra derivada que mostra a data em um formato fácil de ler)
  6. Finalmente invoca a consulta como acima.

: -

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. A tabela Chamadas + data e hora no formato fácil de ler

digite descrição da imagem aqui

2. A tabela SMS + data e hora no formato de leitura fácil

digite descrição da imagem aqui

3. O combinado, lista ordenada

digite descrição da imagem aqui

  • Nota O SMS linhas são realçadas (eles começam com 2 não 1)
  • Um fácil de ler dados e tempo também foi adicionado para a demonstração.

Acho que você gosta

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