如何根据发送日期订购用户消息以供显示?

2020年11月25日 73点热度 0条评论 来源: Alek Piasecki

我有一个应用程序,我在SQLite数据库中存储用户消息数据。我希望能够从每个消息线程访问最新的文本。目前,我有如下这是直接从本地数据库信息的方法:如何根据发送日期订购用户消息以供显示?

var messagesPulled: [pulledMessage]! 

     if openDatabase(){ 
      let query = "select * from messages order by messageNumber asc" 
      do{ 
       print(database) 
       let results: FMResultSet = try database.executeQuery(query, values: nil) 

       while results.next(){ 

        let message = pulledMessage(convoWithUserID: String(describing: results.string(forColumn: "convoWithUserID")), convoWithUserName: String(describing: results.string(forColumn: "convoWithUserName")), messageString: String(describing: results.string(forColumn: "messageString")), senderID: String(describing: results.string(forColumn: "senderID")), timeSent: String(describing: results.string(forColumn: "timeSent")), messageNumber: Int(results.int(forColumn: "messageNumber"))) 
        if messagesPulled == nil{ 
         messagesPulled = [pulledMessage]() 
        } 
        messagesPulled.append(message) 
        print("The message that we have pulled are \(message)") 
       } 

      } 
      catch{ 
       print(error.localizedDescription) 
      } 

      database.close() 
     } 
     return messagesPulled 

的问题是,我想每一个消息线程(基于convoWithUserID)是数组来填充表在自己的个人目标(认为iOS消息应用程序之间用户之间的定期消息传递)。这不是硬盘,并且可以通过完成:

func pullSQLData(messageSet: [message]) -> [String:[message]]{ 
    var i = 0 
    var messageUserID = String() 
    while i < messageSet.count{ 
     if (messageSet[i]).userID != messageUserID{ 
      print("It wasn't equal") 
      print(messageSet[i]) 
      messageUserID = messageSet[i].userID 
      if messageConvoDictionary[messageUserID] != nil{ 
       messageConvoDictionary[messageUserID]?.append(messageSet[i]) 
      }else{ 
       messageConvoDictionary[messageUserID] = [] 
       messageConvoDictionary[messageUserID]?.append(messageSet[i]) 
      } 
      i = i + 1 
     }else{ 
      messageConvoDictionary[messageUserID]?.append(messageSet[i]) 
      i = i + 1 
     } 
    } 
    print(messageConvoDictionary) 
    print(i) 
    return messageConvoDictionary 

} 

的问题是,我想填充一般的消息表(思维方式的iOS涉及自己的短信),其中一般的表是人口稠密以及每个消息对话的最新文本。问题是我不知道该怎么做。我可以根据与上述相同的方式对他们的消息进行分组(假设简化结构)

此功能根据他们来自哪些对话将所有消息字符串分组在一起。我想要做的就是有效地从每个对话中获取最新消息,以填充通用文本表(与您的手机完全相同)。我想通过createdAt来做到这一点,该属性将成为每个对象的一部分(尽管这里没有明确表达)反映了创建对象的创建日期。我的问题是,如何从每个对话中收集最近的消息以显示在常规消息屏幕上(它只显示每个convo的最新消息)?

这里是什么将是在SQL数据库和我想出来的一个例子:

convoWithUserID convoWithUserName messageString sender  timeSent  messageNumber 

abc123   kevin    yo man   xyz987  2017-11-01 4:23:07.000 1    
abc123   kevin    hey dude, wha abc123  2017-11-01 4:25:13.000 2    
fgh456   jason    you going?  xyz987  2017-11-01 4:28:09.000 3    
abc123   kevin    nothing  xyz987  2017-11-01 4:39:47.000 4    
fgh456   jason    no    fgh456  2017-11-01 4:52:13.000 5  

(xyz987将当前用户的这个例子用户ID)。我希望每个单元格都在“查看所有消息”表格中(例如,在iPhone上打开消息应用程序并查看所有对话),以显示每个对话的最新消息。在这种情况下,我会看到两个单元格,一个是杰森发送的消息,其中带有4:52的时间戳,第二个消息给凯文说“没有”,时间戳为4:39 。最近的消息显然不会是每一次表格的最后一端。


===========解决方案如下:

要为每组表行获取一个输出行,请使用GROUP BY。要选择返回哪一行数据,请使用MAX()(这需要SQLite 3.7.11或更高版本):

SELECT ..., 
     MAX(timeSent) 
FROM messages 
GROUP BY convoWithUserID 
ORDER BY ...; 
    原文作者:Alek Piasecki
    原文地址: https://stackoverflow.com/q/45994181
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。