Quero classificar os resultados provenientes de dois cursores. Vamos considerar dois cursores diferentes de ser Cursor
e Cursor1
.
Cursor
é a partir CallLog.Call.CONTENT_URI
e 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;
}
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
- Exclui as tabelas se elas existem para repetição-capacidade.
- Cria tabelas (com base nas colunas que provavelmente existe (nomes podem muito bem ser diferente))
- Cargas alguns dados na tabela de chamadas.
- carrega alguns dados na tabela de SMS (com tempos intercaladas nos tempos de chamada)
- Seleciona as linhas de cada tabela (com uma coluna extra derivada que mostra a data em um formato fácil de ler)
- 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
2. A tabela SMS + data e hora no formato de leitura fácil
3. O combinado, lista ordenada
- 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.