我有一个应用程序,我将用户消息数据存储在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
来做这个,这个属性将是每个对象的一部分(虽然这里没有明确表达),它反映了对象创建的创建日期。我的问题是如何从每个对话中收集最新消息以显示在常规消息传递屏幕上(仅显示每个节目中的最新消息)?
以下是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)。我希望将每个单元格放在一般&#34;查看所有消息&#34;表(如在iPhone上打开消息应用程序并查看所有对话)显示每个对话的最新消息。在这种情况下,我会看到两个单元格,一个是刚刚从杰森发出的消息,&#34; no&#34;时间戳为4:52,第二个带有消息,只是为了kevin说&#34;没有&#34;时间戳为4:39。最近的消息显然不会是每次表格的最后一端。
答案 0 :(得分:1)
要为每组表行获取一个输出行,请使用GROUP BY。要选择返回哪个行数据,请使用MAX()(这需要SQLite 3.7.11或更高版本):
SELECT ...,
MAX(timeSent)
FROM messages
GROUP BY convoWithUserID
ORDER BY ...;