我正在使用SQLite数据库,该数据库在线程ID中包含不同的消息传递会话。要获取主对话列表,请使用以下代码:
database.query(true, MessagesHelper.CONVERSATION_TABLE, inboxCols, null, null, MessagesHelper.THREAD_ID, null, "${MessagesHelper.DATE} DESC", null)
问题是我提供了一个函数来加载未显示的旧消息,我使用它:
database.insert(MessagesHelper.CONVERSATION_TABLE, null, values)
问题在于,在插入的邮件比不同列表用于调用的最新邮件更旧之后,它现在会在收件箱列表中显示较旧的添加邮件,这会使列表全部乱序并导致很多困惑。
这是create语句:
private const val CONVO_CREATE = "CREATE TABLE $CONVERSATION_TABLE($NAME VARCHAR(255), $THREAD_ID VARCHAR(255), $MESSAGE_ID VARCHAR(40), $ADDRESS VARCHAR(14), $BODY VARCHAR(500), $SUBJECT VARCHAR(100), $MMS VARCHAR(255), $MESSAGE_TYPE VARCHAR(7), $MMS_TYPE VARCHAR(20), $CONVERSATION_TYPE VARCHAR(20), $GROUP_ADDRESS VARCHAR(255), $GROUP_NAME VARCHAR(255), $READ VARCHAR(10), $WHO VARCHAR(3), $COUNT INTEGER, $DATE INTEGER);"
收件箱列是:
val inboxCols = arrayOf(MessagesHelper.COUNT, MessagesHelper.GROUP_ADDRESS, MessagesHelper.NAME, MessagesHelper.ADDRESS, MessagesHelper.READ, MessagesHelper.GROUP_NAME, MessagesHelper.BODY, MessagesHelper.DATE, MessagesHelper.THREAD_ID, MessagesHelper.CONVERSATION_TYPE, MessagesHelper.MESSAGE_ID, MessagesHelper.WHO)
是否有任何方法可以插入到数据库中,但是仍然可以按日期按每个thread_id对不同的查询进行排序?
谢谢!
答案 0 :(得分:2)
我认为问题在于DISTINCT认为整行被提取,因此根据列名称,在插入新消息时,COUNT列和DATE列可能会或可能会有所不同(例如,也许count最初会为0?)因此会导致它们插入新行DISTINCT(不重复)。
e.g。考虑一下这个表: -
然后,如果仅在 idbet 列上使用DISTINCT,则结果为2行1,其中idbet为3000,另一行为idbet为1981,其中: -
但是,如果提取列 idbet 和 gamble ,则会提取所有4列,因为现在没有重复项,如下所示: -
如果 _id 350的行在赌博栏中获胜,则会将3行提取为 _id 的349行,而350将根据 idbet 和赌博列,按照: -
或许不是DISTINCT,或者只是DISTINCT,你应该使用WHERE条件或条件(查询的第4和第5个参数)。也许“count< 1”作为第4个参数(5th null),这确实假设count最初为0.另一种方法是减少提取的列,但这可能不实用。