作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对来自两个游标的结果进行排序。让我们将两个不同的游标视为 Cursor
和 Cursor1
。
Cursor
来自 CallLog.Call.CONTENT_URI
,Cursor1
来自 Telephony.Sms.CONTENT_URI
。
问题是两个游标组合列表正在以两种不同的方式排序。我想使用日期列对这个组合列表进行排序。抱歉我的英语不好。
这是我的 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;
}
最佳答案
假设 date 列是一个整数(或一个可识别的 SQLite 日期时间字符串 SQL As Understood By SQLite - Date And Time Functions ),那么根据可用的信息,下面的底层查询可能会按照您的意愿执行,并且单个结果集意味着您只有一个光标。
WITH combined AS (SELECT * FROM Calls UNION SELECT address, type, date, 0 FROM SMS)
SELECT * FROM combined ORDER BY date DESC;
这结合了(形成一个UNION)两个表(使用 0 作为 SMS 的持续时间(联合要求两者具有相同的列数,因此添加 0)) 并根据日期列对组合列表进行排序。
以下
:-
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;
关于java - 如何对两个不同的游标列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58114686/
我是一名优秀的程序员,十分优秀!