消息管理–管理本地消息数据
更新时间:2022-02-28
本文介绍环信即时通讯 IM SDK 如何管理本地消息数据。移动端 SDK 内部使用 SQLite 保存本地消息,方便消息处理。消息以会话为单位进行管理,你可在本地按照会话加载和展示消息。
另外,消息在本地存储时增加了已读未读状态的属性,你可以获取所有会话和特定会话的未读消息数。
功能描述
环信即时通讯 IM 发送和接收到的消息会存储在本地数据库,用户在本地进行消息的操作,体验好。消息以会话为单位管理,可在本地按照会话加载和展示消息。
功能 | 描述 |
---|---|
获取本地所有会话 | 获取本地所有会话,消息本地存储有已读未读状态,会话中包含未读消息数。 |
从数据库中读取指定会话的消息 | 从本地数据库中获取指定会话的消息,进入会话时,获取会话内容。 |
获取指定会话的未读消息数 | 从本地数据库中获取指定会话的未读消息数量。 |
获取所有会话的未读消息数 | 从本地数据库中获取所有会话的未读消息数量。 |
未读消息数清零 | 查看未读消息后,未读消息数清零。可以清零指定的会话和所有会话。 |
删除会话及聊天记录 | 删除本地会话,会话里的聊天记录是否删除是可选项。 |
根据关键字搜索会话消息 | 根据关键字对会话里的消息内容进行搜索。 |
导入消息到数据库 | 将外部消息导入到本地数据库。需要构造消息对象。 |
插入消息 | 模拟收到某些消息通知,可以构造一条消息并写入会话。 |
技术原理
环信即时通讯 IM Android SDK 支持管理用户设备上存储的消息会话数据,其中包含如下主要方法:
loadAllConversations
加载本地存储的会话消息;deleteConversation
删除本地存储的会话;conversation.getUnreadMsgCount
获取指定会话的未读消息数;chatManager().getUnreadMessageCount
获取所有未读消息数;deleteConversationFromServer
删除服务端的会话和聊天记录;searchMsgFromDB
在本地存储的消息中搜索;insertMessage
在指定会话中写入消息。
前提条件
实现方法
获取本地所有会话
你可以调用 API 获取本地所有会话:
Map<String, EMConversation> conversations = EMClient.getInstance().chatManager().getAllConversations();
如果出现偶尔返回的 conversations
的 size
为 0
,很有可能是未调用 EMClient.getInstance().chatManager().loadAllConversations()
。
从数据库中读取指定会话的消息
可以从数据库中读取指定会话的消息:
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
//获取此会话的所有消息。
List<EMMessage> messages = conversation.getAllMessages();
//SDK 初始化时,为每个会话加载 1 条聊天记录。如需更多消息,请到数据库中获取。该方法获取 `startMsgId` 之前的 `pagesize` 条消息,SDK 会将这些消息自动存入此会话,app 无需添加到会话中。
List<EMMessage> messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize);
获取指定会话的未读消息数
可以调用接口获取特定会话的未读消息数,示例代码如下:
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
conversation.getUnreadMsgCount();
获取所有会话的未读消息数
可通过接口获取所有会话的未读消息数量,示例代码如下:
EMClient.getInstance().chatManager().getUnreadMessageCount();
指定会话的未读消息数清零
可以调用接口对特定会话的未读消息数清零,示例代码如下:
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
//指定会话的未读消息数清零。
conversation.markAllMessagesAsRead();
//将一条消息置为已读。
conversation.markMessageAsRead(messageId);
//将所有未读消息数清零。
EMClient.getInstance().chatManager().markAllConversationsAsRead();
删除会话及聊天记录
你可以调用接口删除会话和聊天记录,示例代码如下:
//删除和特定用户的会话,如果需要保留聊天记录,传 `false`。
EMClient.getInstance().chatManager().deleteConversation(username, true);
//删除当前会话的某条聊天记录。
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
conversation.removeMessage(deleteMsg.msgId);
根据关键字搜索会话消息
你可以根据关键字搜索会话消息,示例代码如下:
List<EMMessage> messages = conversation.searchMsgFromDB(keywords, timeStamp, maxCount, from, EMConversation.EMSearchDirection.UP);
导入消息到数据库
若从外部导入消息,可以使用下面的接口,构造 EMMessage
对象,将历史消息导入本地数据库。
EMClient.getInstance().chatManager().importMessages(msgs);
插入消息
如果你需要在本地会话中加入一条消息,比如模拟收到某些通知消息时,可以构造一条消息写入会话。
//根据会话插入消息。
EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username);
conversation.insertMessage(message);
//直接插入消息。
EMClient.getInstance().chatManager().saveMessage(message);
更新消息到 SDK 本地数据库
如果需要更新消息用以下方法:
/**
* 更新消息到 SDK 本地数据库。
* 消息更新后,会话的 latestMessage 等属性进行相应更新,不能更新消息 ID。
*
* @param msg 要更新的消息。
*/
public boolean updateMessage(EMMessage msg)