This commit is contained in:
vera 2023-12-02 03:22:29 +08:00
commit caee732178
18 changed files with 218 additions and 163 deletions

View File

@ -37,4 +37,8 @@
### 1.1.8 ### 1.1.8
* Update message reactions * Update message reactions
### 1.1.9 ### 1.1.9
* Modify message reply to ack issue and Add protocol device flag field * Modify message reply to ack issue and Add protocol device flag field
### 1.2.0
* Modify query channel message error issue
### 1.2.1
* Update channel info refresh listener and optimize data insertion issues

View File

@ -9,7 +9,7 @@
#### 安装 #### 安装
``` ```
dependencies: dependencies:
wukongimfluttersdk: ^1.1.9 wukongimfluttersdk: ^1.2.1
``` ```
#### 引入 #### 引入
```dart ```dart

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -59,7 +59,7 @@ class ChatListDataState extends State<ChatList> {
void initState() { void initState() {
super.initState(); super.initState();
initListener(); initListener();
getMsgList(50000, 0, true); getMsgList(0, 0, true);
} }
initListener() { initListener() {

View File

@ -49,11 +49,13 @@ class ListViewShowDataState extends State<ListViewShowData> {
if (status == WKConnectStatus.connecting) { if (status == WKConnectStatus.connecting) {
_connectionStatusStr = '连接中...'; _connectionStatusStr = '连接中...';
} else if (status == WKConnectStatus.success) { } else if (status == WKConnectStatus.success) {
_connectionStatusStr = '最近会话'; _connectionStatusStr = '最近会话【连接成功】';
} else if (status == WKConnectStatus.noNetwork) { } else if (status == WKConnectStatus.noNetwork) {
_connectionStatusStr = '网络异常'; _connectionStatusStr = '网络异常';
} else if (status == WKConnectStatus.syncMsg) { } else if (status == WKConnectStatus.syncMsg) {
_connectionStatusStr = '同步消息中...'; _connectionStatusStr = '同步消息中...';
} else if (status == WKConnectStatus.kicked) {
_connectionStatusStr = '未连接,在其他设备登录';
} }
setState(() {}); setState(() {});
}); });
@ -163,6 +165,10 @@ class ListViewShowDataState extends State<ListViewShowData> {
height: 200, height: 200,
width: 200, width: 200,
fit: BoxFit.cover, fit: BoxFit.cover,
errorBuilder: (BuildContext context, Object exception,
StackTrace? stackTrace) {
return Image.asset('assets/ic_default_avatar.png');
},
), ),
), ),
Expanded( Expanded(

View File

@ -40,7 +40,7 @@ class HttpUtils {
lastSsgSeqs, // channelID:channelType:last_msg_seq|channelID:channelType:last_msg_seq lastSsgSeqs, // channelID:channelType:last_msg_seq|channelID:channelType:last_msg_seq
"msg_count": 10 // app点进去第一屏的数据 "msg_count": 10 // app点进去第一屏的数据
}); });
print(response.data); // print(response.data);
WKSyncConversation conversation = WKSyncConversation(); WKSyncConversation conversation = WKSyncConversation();
conversation.conversations = []; conversation.conversations = [];
if (response.statusCode == HttpStatus.ok) { if (response.statusCode == HttpStatus.ok) {

View File

@ -30,12 +30,18 @@ class IMUtils {
"https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg", "https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg",
"https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg", "https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg",
"https://lmg.jj20.com/up/allimg/tx28/430423183653303.jpg", "https://lmg.jj20.com/up/allimg/tx28/430423183653303.jpg",
"https://lmg.jj20.com/up/allimg/tx23/520420024834916.jpg" "https://lmg.jj20.com/up/allimg/tx23/520420024834916.jpg",
"https://himg.bdimg.com/sys/portraitn/item/public.1.a535a65d.tJe8MgWmP8zJ456B73Kzfg",
"https://images.liqucn.com/img/h23/h07/img_localize_cb7b78b88d5b33e2ce8921221bf3deae_400x400.png",
"https://img1.baidu.com/it/u=3916753633,2634890492&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400",
"https://img0.baidu.com/it/u=4210586523,443489101&fm=253&fmt=auto&app=138&f=JPEG?w=304&h=304",
"https://img2.baidu.com/it/u=2559320899,1546883787&fm=253&fmt=auto&app=138&f=JPEG?w=441&h=499",
"https://img0.baidu.com/it/u=2952429745,3806929819&fm=253&fmt=auto&app=138&f=JPEG?w=380&h=380",
"https://img2.baidu.com/it/u=3783923022,668713258&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500",
]; ];
WKIM.shared.messageManager.addOnSyncChannelMsgListener((channelID, WKIM.shared.messageManager.addOnSyncChannelMsgListener((channelID,
channelType, startMessageSeq, endMessageSeq, limit, pullMode, back) { channelType, startMessageSeq, endMessageSeq, limit, pullMode, back) {
print('回掉接口');
// //
HttpUtils.syncChannelMsg(channelID, channelType, startMessageSeq, HttpUtils.syncChannelMsg(channelID, channelType, startMessageSeq,
endMessageSeq, limit, pullMode, (p0) => back(p0)); endMessageSeq, limit, pullMode, (p0) => back(p0));
@ -43,6 +49,7 @@ class IMUtils {
// channel资料 // channel资料
WKIM.shared.channelManager WKIM.shared.channelManager
.addOnGetChannelListener((channelId, channelType, back) { .addOnGetChannelListener((channelId, channelType, back) {
print('获取channel资料');
if (channelType == WKChannelType.personal) { if (channelType == WKChannelType.personal) {
// //
// API请求后返回 // API请求后返回
@ -58,9 +65,9 @@ class IMUtils {
var index = channel.channelID.hashCode % imgs.length; var index = channel.channelID.hashCode % imgs.length;
channel.avatar = imgs[index]; channel.avatar = imgs[index];
back(channel); back(channel);
back(channel);
} }
}); });
//
WKIM.shared.conversationManager WKIM.shared.conversationManager
.addOnSyncConversationListener((lastSsgSeqs, msgCount, version, back) { .addOnSyncConversationListener((lastSsgSeqs, msgCount, version, back) {
HttpUtils.syncConversation(lastSsgSeqs, msgCount, version, back); HttpUtils.syncConversation(lastSsgSeqs, msgCount, version, back);

View File

@ -1,6 +1,7 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:convert'; import 'dart:convert';
import 'package:sqflite/sqflite.dart';
import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/const.dart';
import 'package:wukongimfluttersdk/entity/channel.dart'; import 'package:wukongimfluttersdk/entity/channel.dart';
@ -12,11 +13,11 @@ class ChannelDB {
static ChannelDB get shared => _instance; static ChannelDB get shared => _instance;
Future<WKChannel?> query(String channelID, int channelType) async { Future<WKChannel?> query(String channelID, int channelType) async {
String sql =
"select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType";
WKChannel? channel; WKChannel? channel;
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableChannel,
where: "channel_id=? and channel_type=?",
whereArgs: [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
channel = WKDBConst.serializeChannel(list[0]); channel = WKDBConst.serializeChannel(list[0]);
} }
@ -44,8 +45,8 @@ class ChannelDB {
if (updateList.isNotEmpty) { if (updateList.isNotEmpty) {
for (Map<String, dynamic> value in updateList) { for (Map<String, dynamic> value in updateList) {
txn.update(WKDBConst.tableChannel, value, txn.update(WKDBConst.tableChannel, value,
where: where: "channel_id=? and channel_type=?",
"channel_id='${value['channel_id']}' and channel_type=${value['channel_type']}"); whereArgs: [value['channel_id'], value['channel_type']]);
} }
} }
}); });
@ -62,26 +63,27 @@ class ChannelDB {
} }
insert(WKChannel channel) { insert(WKChannel channel) {
WKDBHelper.shared.getDB().insert(WKDBConst.tableChannel, getMap(channel)); WKDBHelper.shared.getDB().insert(WKDBConst.tableChannel, getMap(channel),
conflictAlgorithm: ConflictAlgorithm.replace);
} }
update(WKChannel channel) { update(WKChannel channel) {
WKDBHelper.shared.getDB().update(WKDBConst.tableChannel, getMap(channel), WKDBHelper.shared.getDB().update(WKDBConst.tableChannel, getMap(channel),
where: where: "channel_id=? and channel_type=?",
"channel_id='${channel.channelID}' and channel_type=${channel.channelType}"); whereArgs: [channel.channelID, channel.channelType]);
} }
Future<bool> isExist(String channelID, int channelType) async { Future<bool> isExist(String channelID, int channelType) async {
bool isExit = false; bool isExit = false;
String sql = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
"select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType"; WKDBConst.tableChannel,
List<Map<String, Object?>> list = where: "channel_id=? and channel_type=?",
await WKDBHelper.shared.getDB().rawQuery(sql); whereArgs: [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
if (data != null) { if (data != null) {
String channelID = WKDBConst.readString(data, 'channel_id'); String channelID = WKDBConst.readString(data, 'channel_id');
if (channelID != '' && channelID.isNotEmpty) { if (channelID != '') {
isExit = true; isExit = true;
} }
} }
@ -104,11 +106,11 @@ class ChannelDB {
sb.write("'"); sb.write("'");
} }
String channelIds = sb.toString(); String channelIds = sb.toString();
String sql =
"select * from ${WKDBConst.tableChannel} where channel_id in ($channelIds) and channel_type=$channelType";
List<WKChannel> list = []; List<WKChannel> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableChannel,
where: "channel_id in (?) and channel_type=?",
whereArgs: [channelIds, channelType]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannel(data)); list.add(WKDBConst.serializeChannel(data));

View File

@ -1,3 +1,5 @@
import 'package:sqflite/sqflite.dart';
import '../entity/channel_member.dart'; import '../entity/channel_member.dart';
import 'const.dart'; import 'const.dart';
import 'wk_db_helper.dart'; import 'wk_db_helper.dart';
@ -21,11 +23,11 @@ class ChannelMemberDB {
sb.write(uidList[i]); sb.write(uidList[i]);
sb.write("'"); sb.write("'");
} }
String sql =
"select * from ${WKDBConst.tableChannelMember} where channel_id='$channelID' and channel_type=$channelType and member_uid in (${sb.toString()})";
List<WKChannelMember> list = []; List<WKChannelMember> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableChannelMember,
where: "channel_id=? and channel_type=? and member_uid in (?)",
whereArgs: [channelID, channelType, sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannelMember(data)); list.add(WKDBConst.serializeChannelMember(data));
@ -36,11 +38,11 @@ class ChannelMemberDB {
Future<int> getMaxVersion(String channelID, int channelType) async { Future<int> getMaxVersion(String channelID, int channelType) async {
String sql = String sql =
"select max(version) version from ${WKDBConst.tableChannelMember} where channel_id ='$channelID' and channel_type=$channelType limit 0, 1"; "select max(version) version from ${WKDBConst.tableChannelMember} where channel_id =? and channel_type=? limit 0, 1";
int version = 0; int version = 0;
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
dynamic data = results[0]; dynamic data = results[0];
version = WKDBConst.readInt(data, 'version'); version = WKDBConst.readInt(data, 'version');
@ -51,10 +53,11 @@ class ChannelMemberDB {
Future<WKChannelMember?> queryWithUID( Future<WKChannelMember?> queryWithUID(
String channelId, int channelType, String memberUID) async { String channelId, int channelType, String memberUID) async {
String sql = String sql =
"select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} left join ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid = ${WKDBConst.tableChannel}.channel_id AND ${WKDBConst.tableChannel}.channel_type=1 where (${WKDBConst.tableChannelMember}.channel_id='$channelId' and ${WKDBConst.tableChannelMember}.channel_type=$channelType and ${WKDBConst.tableChannelMember}.member_uid='$memberUID')"; "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} left join ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid = ${WKDBConst.tableChannel}.channel_id AND ${WKDBConst.tableChannel}.channel_type=1 where (${WKDBConst.tableChannelMember}.channel_id=? and ${WKDBConst.tableChannelMember}.channel_type=? and ${WKDBConst.tableChannelMember}.member_uid=?)";
WKChannelMember? channelMember; WKChannelMember? channelMember;
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared
await WKDBHelper.shared.getDB().rawQuery(sql); .getDB()
.rawQuery(sql, [channelId, channelType, memberUID]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
channelMember = WKDBConst.serializeChannelMember(list[0]); channelMember = WKDBConst.serializeChannelMember(list[0]);
} }
@ -64,10 +67,10 @@ class ChannelMemberDB {
Future<List<WKChannelMember>?> queryWithChannel( Future<List<WKChannelMember>?> queryWithChannel(
String channelId, int channelType) async { String channelId, int channelType) async {
String sql = String sql =
"select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} LEFT JOIN ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid=${WKDBConst.tableChannel}.channel_id and ${WKDBConst.tableChannel}.channel_type=1 where ${WKDBConst.tableChannelMember}.channel_id='$channelId' and ${WKDBConst.tableChannelMember}.channel_type=$channelType and ${WKDBConst.tableChannelMember}.is_deleted=0 and ${WKDBConst.tableChannelMember}.status=1 order by ${WKDBConst.tableChannelMember}.role=1 desc,${WKDBConst.tableChannelMember}.role=2 desc,${WKDBConst.tableChannelMember}.created_at asc"; "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} LEFT JOIN ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid=${WKDBConst.tableChannel}.channel_id and ${WKDBConst.tableChannel}.channel_type=1 where ${WKDBConst.tableChannelMember}.channel_id=? and ${WKDBConst.tableChannelMember}.channel_type=? and ${WKDBConst.tableChannelMember}.is_deleted=0 and ${WKDBConst.tableChannelMember}.status=1 order by ${WKDBConst.tableChannelMember}.role=1 desc,${WKDBConst.tableChannelMember}.role=2 desc,${WKDBConst.tableChannelMember}.created_at asc";
List<WKChannelMember> list = []; List<WKChannelMember> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelId, channelType]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannelMember(data)); list.add(WKDBConst.serializeChannelMember(data));
@ -88,11 +91,11 @@ class ChannelMemberDB {
sb.write("'"); sb.write("'");
} }
String sql =
"select * from ${WKDBConst.tableChannelMember} where channel_id ='$channelID' and channel_type=$channelType and member_uid in (${sb.toString()})";
List<WKChannelMember> list = []; List<WKChannelMember> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableChannelMember,
where: "channel_id=? and channel_type=? and member_uid in (?) ",
whereArgs: [channelID, channelType, sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannelMember(data)); list.add(WKDBConst.serializeChannelMember(data));
@ -122,15 +125,20 @@ class ChannelMemberDB {
WKDBHelper.shared.getDB().transaction((txn) async { WKDBHelper.shared.getDB().transaction((txn) async {
if (insertCVList.isNotEmpty) { if (insertCVList.isNotEmpty) {
for (Map<String, dynamic> value in insertCVList) { for (Map<String, dynamic> value in insertCVList) {
txn.insert(WKDBConst.tableChannelMember, value); txn.insert(WKDBConst.tableChannelMember, value,
conflictAlgorithm: ConflictAlgorithm.replace);
} }
} }
if (updateCVList.isNotEmpty) { if (updateCVList.isNotEmpty) {
for (Map<String, dynamic> value in updateCVList) { for (Map<String, dynamic> value in updateCVList) {
txn.update(WKDBConst.tableChannelMember, value, txn.update(WKDBConst.tableChannelMember, value,
where: where: "channel_id=? and channel_type=? and member_uid=?",
"channel_id='${value['channel_id']}' and channel_type=${value['channel_type']} and member_uid='${value['member_uid']}'"); whereArgs: [
value['channel_id'],
value['channel_type'],
value['member_uid']
]);
} }
} }
}); });

View File

@ -1,7 +1,9 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:convert'; import 'dart:convert';
import 'package:sqflite/sqflite.dart';
import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/const.dart';
import 'package:wukongimfluttersdk/entity/channel.dart';
import '../entity/conversation.dart'; import '../entity/conversation.dart';
import 'wk_db_helper.dart'; import 'wk_db_helper.dart';
@ -24,7 +26,10 @@ class ConversationDB {
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
WKConversationMsg msg = WKDBConst.serializeCoversation(data); WKConversationMsg msg = WKDBConst.serializeCoversation(data);
list.add(getUIMsg(msg)); WKChannel wkChannel = WKDBConst.serializeChannel(data);
WKUIConversationMsg uiMsg = getUIMsg(msg);
uiMsg.setWkChannel(wkChannel);
list.add(uiMsg);
} }
} }
return list; return list;
@ -35,7 +40,8 @@ class ConversationDB {
data['is_deleted'] = 1; data['is_deleted'] = 1;
int row = await WKDBHelper.shared.getDB().update( int row = await WKDBHelper.shared.getDB().update(
WKDBConst.tableConversation, data, WKDBConst.tableConversation, data,
where: "channel_id='$channelID' and channel_type=$channelType"); where: "channel_id=? and channel_type=?",
whereArgs: [channelID, channelType]);
return row > 0; return row > 0;
} }
@ -46,9 +52,9 @@ class ConversationDB {
conversationMsg.channelID, conversationMsg.channelType); conversationMsg.channelID, conversationMsg.channelType);
if (lastMsg == null || lastMsg.channelID.isEmpty) { if (lastMsg == null || lastMsg.channelID.isEmpty) {
row = await WKDBHelper.shared row = await WKDBHelper.shared.getDB().insert(
.getDB() WKDBConst.tableConversation, getMap(conversationMsg, false),
.insert(WKDBConst.tableConversation, getMap(conversationMsg, false)); conflictAlgorithm: ConflictAlgorithm.replace);
} else { } else {
conversationMsg.unreadCount = conversationMsg.unreadCount =
lastMsg.unreadCount + conversationMsg.unreadCount; lastMsg.unreadCount + conversationMsg.unreadCount;
@ -66,11 +72,11 @@ class ConversationDB {
Future<WKConversationMsg?> queryMsgByMsgChannelId( Future<WKConversationMsg?> queryMsgByMsgChannelId(
String channelId, int channelType) async { String channelId, int channelType) async {
WKConversationMsg? msg; WKConversationMsg? msg;
String sql =
"select * from ${WKDBConst.tableConversation} where channel_id='$channelId' and channel_type=$channelType";
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableConversation,
where: "channel_id=? and channel_type=?",
whereArgs: [channelId, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
msg = WKDBConst.serializeCoversation(list[0]); msg = WKDBConst.serializeCoversation(list[0]);
} }
@ -116,11 +122,11 @@ class ConversationDB {
sb.write(channelIds[i]); sb.write(channelIds[i]);
sb.write("'"); sb.write("'");
} }
String sql =
"select * from '${WKDBConst.tableConversation}' where channel_id in(${sb.toString()})";
List<WKConversationMsg> list = []; List<WKConversationMsg> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableConversation,
where: "channel_id in (?)",
whereArgs: [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeCoversation(data)); list.add(WKDBConst.serializeCoversation(data));
@ -160,14 +166,15 @@ class ConversationDB {
WKDBHelper.shared.getDB().transaction((txn) async { WKDBHelper.shared.getDB().transaction((txn) async {
if (insertList.isNotEmpty) { if (insertList.isNotEmpty) {
for (int i = 0; i < insertList.length; i++) { for (int i = 0; i < insertList.length; i++) {
txn.insert(WKDBConst.tableConversation, insertList[i]); txn.insert(WKDBConst.tableConversation, insertList[i],
conflictAlgorithm: ConflictAlgorithm.replace);
} }
} }
if (updateList.isNotEmpty) { if (updateList.isNotEmpty) {
for (Map<String, dynamic> value in updateList) { for (Map<String, dynamic> value in updateList) {
txn.update(WKDBConst.tableConversation, value, txn.update(WKDBConst.tableConversation, value,
where: where: "channel_id=? and channel_type=?",
"channel_id='${value['channel_id']}' and channel_type=${value['channel_type']}"); whereArgs: [value['channel_id'], value['channel_type']]);
} }
} }
}); });
@ -196,7 +203,8 @@ class ConversationDB {
dynamic map, String channelID, int channelType) async { dynamic map, String channelID, int channelType) async {
return await WKDBHelper.shared.getDB().update( return await WKDBHelper.shared.getDB().update(
WKDBConst.tableConversation, map, WKDBConst.tableConversation, map,
where: "channel_id='$channelID' and channel_type=$channelType"); where: "channel_id=? and channel_type=?",
whereArgs: [channelID, channelType]);
} }
WKUIConversationMsg getUIMsg(WKConversationMsg conversationMsg) { WKUIConversationMsg getUIMsg(WKConversationMsg conversationMsg) {

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:sqflite/sqflite.dart';
import 'package:wukongimfluttersdk/db/channel.dart'; import 'package:wukongimfluttersdk/db/channel.dart';
import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/const.dart';
import 'package:wukongimfluttersdk/db/reaction.dart'; import 'package:wukongimfluttersdk/db/reaction.dart';
@ -23,10 +24,10 @@ class MessageDB {
Future<bool> isExist(String clientMsgNo) async { Future<bool> isExist(String clientMsgNo) async {
bool isExist = false; bool isExist = false;
String sql = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
"select * from ${WKDBConst.tableMessage} where client_msg_no='$clientMsgNo'"; WKDBConst.tableMessage,
List<Map<String, Object?>> list = where: "client_msg_no=?",
await WKDBHelper.shared.getDB().rawQuery(sql); whereArgs: [clientMsgNo]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
isExist = true; isExist = true;
} }
@ -45,36 +46,35 @@ class MessageDB {
msg.clientMsgNO = WKIM.shared.messageManager.generateClientMsgNo(); msg.clientMsgNO = WKIM.shared.messageManager.generateClientMsgNo();
} }
} }
return await WKDBHelper.shared return await WKDBHelper.shared.getDB().insert(
.getDB() WKDBConst.tableMessage, getMap(msg),
.insert(WKDBConst.tableMessage, getMap(msg)); conflictAlgorithm: ConflictAlgorithm.replace);
} }
Future<int> updateMsg(WKMsg msg) async { Future<int> updateMsg(WKMsg msg) async {
return await WKDBHelper.shared.getDB().update( return await WKDBHelper.shared.getDB().update(
WKDBConst.tableMessage, getMap(msg), WKDBConst.tableMessage, getMap(msg),
where: "client_seq=${msg.clientSeq}"); where: "client_seq=?", whereArgs: [msg.clientSeq]);
} }
Future<int> updateMsgWithField(dynamic map, int clientSeq) async { Future<int> updateMsgWithField(dynamic map, int clientSeq) async {
return await WKDBHelper.shared return await WKDBHelper.shared.getDB().update(WKDBConst.tableMessage, map,
.getDB() where: "client_seq=?", whereArgs: [clientSeq]);
.update(WKDBConst.tableMessage, map, where: "client_seq=$clientSeq");
} }
Future<int> updateMsgWithFieldAndClientMsgNo( Future<int> updateMsgWithFieldAndClientMsgNo(
dynamic map, String clientMsgNO) async { dynamic map, String clientMsgNO) async {
return await WKDBHelper.shared.getDB().update(WKDBConst.tableMessage, map, return await WKDBHelper.shared.getDB().update(WKDBConst.tableMessage, map,
where: "client_msg_no='$clientMsgNO'"); where: "client_msg_no=?", whereArgs: [clientMsgNO]);
} }
Future<WKMsg?> queryWithClientMsgNo(String clientMsgNo) async { Future<WKMsg?> queryWithClientMsgNo(String clientMsgNo) async {
WKMsg? wkMsg; WKMsg? wkMsg;
String sql = String sql =
"select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_msg_no='$clientMsgNo'"; "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_msg_no=?";
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [clientMsgNo]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
wkMsg = WKDBConst.serializeWKMsg(list[0]); wkMsg = WKDBConst.serializeWKMsg(list[0]);
} }
@ -88,10 +88,10 @@ class MessageDB {
Future<WKMsg?> queryWithClientSeq(int clientSeq) async { Future<WKMsg?> queryWithClientSeq(int clientSeq) async {
WKMsg? wkMsg; WKMsg? wkMsg;
String sql = String sql =
"select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_seq=$clientSeq"; "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_seq=?";
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [clientSeq]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
wkMsg = WKDBConst.serializeWKMsg(list[0]); wkMsg = WKDBConst.serializeWKMsg(list[0]);
} }
@ -114,10 +114,10 @@ class MessageDB {
} }
String sql = String sql =
"select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (${sb.toString()})"; "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (?)";
List<WKMsg> list = []; List<WKMsg> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeWKMsg(data)); list.add(WKDBConst.serializeWKMsg(data));
@ -129,9 +129,9 @@ class MessageDB {
Future<int> queryMaxOrderSeq(String channelID, int channelType) async { Future<int> queryMaxOrderSeq(String channelID, int channelType) async {
int maxOrderSeq = 0; int maxOrderSeq = 0;
String sql = String sql =
"select max(order_seq) order_seq from ${WKDBConst.tableMessage} where channel_id ='$channelID' and channel_type=$channelType and type<>99 and type<>0 and is_deleted=0"; "select max(order_seq) order_seq from ${WKDBConst.tableMessage} where channel_id =? and channel_type=? and type<>99 and type<>0 and is_deleted=0";
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
maxOrderSeq = WKDBConst.readInt(data, 'order_seq'); maxOrderSeq = WKDBConst.readInt(data, 'order_seq');
@ -141,10 +141,10 @@ class MessageDB {
Future<int> getMaxMessageSeq(String channelID, int channelType) async { Future<int> getMaxMessageSeq(String channelID, int channelType) async {
String sql = String sql =
"SELECT max(message_seq) message_seq FROM ${WKDBConst.tableMessage} WHERE channel_id='$channelID' AND channel_type=$channelType"; "SELECT max(message_seq) message_seq FROM ${WKDBConst.tableMessage} WHERE channel_id=? AND channel_type=?";
int messageSeq = 0; int messageSeq = 0;
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
messageSeq = WKDBConst.readInt(data, 'message_seq'); messageSeq = WKDBConst.readInt(data, 'message_seq');
@ -156,9 +156,10 @@ class MessageDB {
String channelID, int channelType, int maxOrderSeq, int limit) async { String channelID, int channelType, int maxOrderSeq, int limit) async {
int minOrderSeq = 0; int minOrderSeq = 0;
String sql = String sql =
"select order_seq from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type='$channelType' and type<>99 and order_seq <= $maxOrderSeq order by order_seq desc limit $limit"; "select order_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and type<>99 and order_seq <=? order by order_seq desc limit ?";
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared
await WKDBHelper.shared.getDB().rawQuery(sql); .getDB()
.rawQuery(sql, [channelID, channelType, maxOrderSeq, limit]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
minOrderSeq = WKDBConst.readInt(data, 'order_seq'); minOrderSeq = WKDBConst.readInt(data, 'order_seq');
@ -170,34 +171,41 @@ class MessageDB {
int oldestOrderSeq, bool contain, int pullMode, int limit) async { int oldestOrderSeq, bool contain, int pullMode, int limit) async {
List<WKMsg> msgList = []; List<WKMsg> msgList = [];
String sql; String sql;
var args = [];
if (oldestOrderSeq <= 0) { if (oldestOrderSeq <= 0) {
sql = sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
args.add(channelId);
args.add(channelType);
args.add(limit);
} else { } else {
if (pullMode == 0) { if (pullMode == 0) {
if (contain) { if (contain) {
sql = sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<=$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
} else { } else {
sql = sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
} }
} else { } else {
if (contain) { if (contain) {
sql = sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>=$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,$limit"; "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
} else { } else {
sql = sql =
"SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,$limit"; "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
} }
} }
args.add(channelId);
args.add(channelType);
args.add(oldestOrderSeq);
args.add(limit);
} }
List<String> messageIds = []; List<String> messageIds = [];
List<String> replyMsgIds = []; List<String> replyMsgIds = [];
List<String> fromUIDs = []; List<String> fromUIDs = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, args);
if (results.isNotEmpty) { if (results.isNotEmpty) {
WKChannel? wkChannel = WKChannel? wkChannel =
@ -468,10 +476,11 @@ class MessageDB {
Future<int> getDeletedCount(int minMessageSeq, int maxMessageSeq, Future<int> getDeletedCount(int minMessageSeq, int maxMessageSeq,
String channelID, int channelType) async { String channelID, int channelType) async {
String sql = String sql =
"select count(*) num from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and message_seq>$minMessageSeq and message_seq<$maxMessageSeq and is_deleted=1"; "select count(*) num from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and message_seq>? and message_seq<? and is_deleted=1";
int num = 0; int num = 0;
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared
await WKDBHelper.shared.getDB().rawQuery(sql); .getDB()
.rawQuery(sql, [channelID, channelType, minMessageSeq, maxMessageSeq]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
num = WKDBConst.readInt(data, 'num'); num = WKDBConst.readInt(data, 'num');
@ -485,14 +494,15 @@ class MessageDB {
int messageSeq = 0; int messageSeq = 0;
if (pullMode == 1) { if (pullMode == 1) {
sql = sql =
"select message_seq from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and order_seq>$oldestOrderSeq and message_seq<>0 order by message_seq desc limit 1"; "select message_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and order_seq>? and message_seq<>0 order by message_seq desc limit 1";
} else { } else {
sql = sql =
"select message_seq from ${WKDBConst.tableMessage} where channel_id=$channelID and channel_type=$channelType and order_seq<$oldestOrderSeq and message_seq<>0 order by message_seq asc limit 1"; "select message_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and order_seq<? and message_seq<>0 order by message_seq asc limit 1";
} }
List<Map<String, Object?>> list = List<Map<String, Object?>> list = await WKDBHelper.shared
await WKDBHelper.shared.getDB().rawQuery(sql); .getDB()
.rawQuery(sql, [channelID, channelType, oldestOrderSeq]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
messageSeq = WKDBConst.readInt(data, 'message_seq'); messageSeq = WKDBConst.readInt(data, 'message_seq');
@ -563,7 +573,8 @@ class MessageDB {
if (cvList.isNotEmpty) { if (cvList.isNotEmpty) {
WKDBHelper.shared.getDB().transaction((txn) async { WKDBHelper.shared.getDB().transaction((txn) async {
for (int i = 0; i < cvList.length; i++) { for (int i = 0; i < cvList.length; i++) {
txn.insert(WKDBConst.tableMessage, cvList[i]); txn.insert(WKDBConst.tableMessage, cvList[i],
conflictAlgorithm: ConflictAlgorithm.replace);
} }
}); });
} }
@ -572,8 +583,7 @@ class MessageDB {
Future<List<WKMsg>> queryWithClientMsgNos(List<String> clientMsgNos) async { Future<List<WKMsg>> queryWithClientMsgNos(List<String> clientMsgNos) async {
List<WKMsg> msgs = []; List<WKMsg> msgs = [];
StringBuffer sb = StringBuffer(); StringBuffer sb = StringBuffer();
sb.write(
"select * from ${WKDBConst.tableMessage} where client_msg_no in (");
for (int i = 0, size = clientMsgNos.length; i < size; i++) { for (int i = 0, size = clientMsgNos.length; i < size; i++) {
if (i != 0) { if (i != 0) {
sb.write(","); sb.write(",");
@ -582,10 +592,11 @@ class MessageDB {
sb.write(clientMsgNos[i]); sb.write(clientMsgNos[i]);
sb.write("'"); sb.write("'");
} }
sb.write(")");
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sb.toString()); WKDBConst.tableMessage,
where: "client_msg_no in (?)",
whereArgs: [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
msgs.add(WKDBConst.serializeWKMsg(data)); msgs.add(WKDBConst.serializeWKMsg(data));
@ -621,12 +632,14 @@ class MessageDB {
WKDBHelper.shared.getDB().transaction((txn) async { WKDBHelper.shared.getDB().transaction((txn) async {
if (insertCVList.isNotEmpty) { if (insertCVList.isNotEmpty) {
for (int i = 0; i < insertCVList.length; i++) { for (int i = 0; i < insertCVList.length; i++) {
txn.insert(WKDBConst.tableMessageExtra, insertCVList[0]); txn.insert(WKDBConst.tableMessageExtra, insertCVList[0],
conflictAlgorithm: ConflictAlgorithm.replace);
} }
if (updateCVList.isNotEmpty) { if (updateCVList.isNotEmpty) {
for (int i = 0; i < updateCVList.length; i++) { for (int i = 0; i < updateCVList.length; i++) {
txn.update(WKDBConst.tableMessageExtra, updateCVList[0], txn.update(WKDBConst.tableMessageExtra, updateCVList[0],
where: "message_id='${updateCVList[i]['message_id']}'"); where: "message_id=?",
whereArgs: [updateCVList[i]['message_id']]);
} }
} }
} }
@ -639,9 +652,9 @@ class MessageDB {
String channelID, int channelType) async { String channelID, int channelType) async {
int extraVersion = 0; int extraVersion = 0;
String sql = String sql =
"select max(extra_version) extra_version from ${WKDBConst.tableMessageExtra} where channel_id ='$channelID' and channel_type=$channelType"; "select max(extra_version) extra_version from ${WKDBConst.tableMessageExtra} where channel_id =? and channel_type=?";
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
extraVersion = WKDBConst.readInt(data, 'extra_version'); extraVersion = WKDBConst.readInt(data, 'extra_version');
@ -651,10 +664,10 @@ class MessageDB {
Future<List<WKMsgExtra>> queryMsgExtraWithNeedUpload(int needUpload) async { Future<List<WKMsgExtra>> queryMsgExtraWithNeedUpload(int needUpload) async {
String sql = String sql =
"select * from ${WKDBConst.tableMessageExtra} where needUpload=$needUpload"; "select * from ${WKDBConst.tableMessageExtra} where need_upload=?";
List<WKMsgExtra> list = []; List<WKMsgExtra> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [needUpload]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeMsgExtra(data)); list.add(WKDBConst.serializeMsgExtra(data));
@ -666,10 +679,10 @@ class MessageDB {
Future<WKMsgExtra?> queryMsgExtraWithMsgID(String messageID) async { Future<WKMsgExtra?> queryMsgExtraWithMsgID(String messageID) async {
WKMsgExtra? msgExtra; WKMsgExtra? msgExtra;
String sql = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
"select * from ${WKDBConst.tableMessageExtra} where message_id='$messageID'"; WKDBConst.tableMessageExtra,
List<Map<String, Object?>> list = where: "message_id=?",
await WKDBHelper.shared.getDB().rawQuery(sql); whereArgs: [messageID]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
msgExtra = WKDBConst.serializeMsgExtra(list[0]); msgExtra = WKDBConst.serializeMsgExtra(list[0]);
} }
@ -678,8 +691,6 @@ class MessageDB {
Future<List<WKMsgExtra>> queryMsgExtrasWithMsgIds(List<String> msgIds) async { Future<List<WKMsgExtra>> queryMsgExtrasWithMsgIds(List<String> msgIds) async {
StringBuffer sb = StringBuffer(); StringBuffer sb = StringBuffer();
sb.write(
"select * from ${WKDBConst.tableMessageExtra} where message_id in (");
for (int i = 0, size = msgIds.length; i < size; i++) { for (int i = 0, size = msgIds.length; i < size; i++) {
if (i != 0) { if (i != 0) {
sb.write(","); sb.write(",");
@ -688,10 +699,11 @@ class MessageDB {
sb.write(msgIds[i]); sb.write(msgIds[i]);
sb.write("'"); sb.write("'");
} }
sb.write(")");
List<WKMsgExtra> list = []; List<WKMsgExtra> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sb.toString()); WKDBConst.tableMessageExtra,
where: "message_id in (?)",
whereArgs: [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeMsgExtra(data)); list.add(WKDBConst.serializeMsgExtra(data));
@ -713,9 +725,9 @@ class MessageDB {
String channelID, int channelType) async { String channelID, int channelType) async {
WKMsg? wkMsg; WKMsg? wkMsg;
String sql = String sql =
"select * from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and is_deleted=0 and type<>0 and type<>99 order by order_seq desc limit 1"; "select * from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and is_deleted=0 and type<>0 and type<>99 order by order_seq desc limit 1";
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
if (data != null) { if (data != null) {

View File

@ -1,3 +1,4 @@
import 'package:sqflite/sqflite.dart';
import 'package:wukongimfluttersdk/entity/msg.dart'; import 'package:wukongimfluttersdk/entity/msg.dart';
import 'const.dart'; import 'const.dart';
@ -10,11 +11,11 @@ class ReactionDB {
Future<int> queryMaxSeqWithChannel(String channelID, int channelType) async { Future<int> queryMaxSeqWithChannel(String channelID, int channelType) async {
String sql = String sql =
"select max(seq) seq from ${WKDBConst.tableMessageReaction} where channel_id='$channelID' and channel_type=$channelType limit 0, 1"; "select max(seq) seq from ${WKDBConst.tableMessageReaction} where channel_id=? and channel_type=? limit 0, 1";
int version = 0; int version = 0;
List<Map<String, Object?>> list = List<Map<String, Object?>> list =
await WKDBHelper.shared.getDB().rawQuery(sql); await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]);
if (list.isNotEmpty) { if (list.isNotEmpty) {
dynamic data = list[0]; dynamic data = list[0];
if (data != null) { if (data != null) {
@ -25,12 +26,12 @@ class ReactionDB {
} }
Future<List<WKMsgReaction>> queryWithMessageId(String messageId) async { Future<List<WKMsgReaction>> queryWithMessageId(String messageId) async {
String sql =
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageId' and is_deleted=0 ORDER BY created_at desc";
List<WKMsgReaction> list = []; List<WKMsgReaction> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
List<Map<String, Object?>> results = WKDBConst.tableMessageReaction,
await WKDBHelper.shared.getDB().rawQuery(sql); where: "message_id=? and is_deleted=0",
whereArgs: [messageId],
orderBy: "created_at desc");
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeMsgReation(data)); list.add(WKDBConst.serializeMsgReation(data));
@ -51,11 +52,12 @@ class ReactionDB {
sb.write("'"); sb.write("'");
} }
String sql =
"select * from ${WKDBConst.tableMessageReaction} where message_id in (${sb.toString()}) and is_deleted=0 ORDER BY created_at desc";
List<WKMsgReaction> list = []; List<WKMsgReaction> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableMessageReaction,
where: "message_id in (?) and is_deleted=0",
whereArgs: [sb.toString()],
orderBy: "created_at desc");
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeMsgReation(data)); list.add(WKDBConst.serializeMsgReation(data));
@ -86,22 +88,22 @@ class ReactionDB {
map['seq'] = reaction.seq; map['seq'] = reaction.seq;
map['emoji'] = reaction.emoji; map['emoji'] = reaction.emoji;
WKDBHelper.shared.getDB().update(WKDBConst.tableMessageReaction, map, WKDBHelper.shared.getDB().update(WKDBConst.tableMessageReaction, map,
where: "message_id='${reaction.messageID}' and uid='${reaction.uid}'"); where: "message_id=? and uid=?",
whereArgs: [reaction.messageID, reaction.uid]);
} }
insertReaction(WKMsgReaction reaction) { insertReaction(WKMsgReaction reaction) {
WKDBHelper.shared WKDBHelper.shared.getDB().insert(
.getDB() WKDBConst.tableMessageReaction, getReactionMap(reaction),
.insert(WKDBConst.tableMessageReaction, getReactionMap(reaction)); conflictAlgorithm: ConflictAlgorithm.replace);
} }
Future<bool> isExistReaction(String uid, String messageID) async { Future<bool> isExistReaction(String uid, String messageID) async {
bool isExist = false; bool isExist = false;
String sql = List<Map<String, Object?>> list = await WKDBHelper.shared.getDB().query(
"select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' "; WKDBConst.tableMessageReaction,
where: "message_id=? and uid=?",
List<Map<String, Object?>> list = whereArgs: [messageID, uid]);
await WKDBHelper.shared.getDB().rawQuery(sql);
if (list.isNotEmpty) { if (list.isNotEmpty) {
isExist = true; isExist = true;
} }

View File

@ -1,6 +1,7 @@
import 'dart:collection'; import 'dart:collection';
import 'dart:convert'; import 'dart:convert';
import 'package:sqflite/sqflite.dart';
import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/const.dart';
import 'package:wukongimfluttersdk/db/conversation.dart'; import 'package:wukongimfluttersdk/db/conversation.dart';
import 'package:wukongimfluttersdk/db/wk_db_helper.dart'; import 'package:wukongimfluttersdk/db/wk_db_helper.dart';
@ -32,12 +33,12 @@ class ReminderDB {
Future<List<WKReminder>> queryWithChannel( Future<List<WKReminder>> queryWithChannel(
String channelID, int channelType, int done) async { String channelID, int channelType, int done) async {
String sql =
"select * from ${WKDBConst.tableReminders} where channel_id='$channelID' and channel_type=$channelType and done=$done order by message_seq desc";
List<WKReminder> list = []; List<WKReminder> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
List<Map<String, Object?>> results = WKDBConst.tableReminders,
await WKDBHelper.shared.getDB().rawQuery(sql); where: "channel_id=? and channel_type=? and done=?",
whereArgs: [channelID, channelType, done],
orderBy: "message_seq desc");
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeReminder(data)); list.add(WKDBConst.serializeReminder(data));
@ -84,7 +85,8 @@ class ReminderDB {
WKDBHelper.shared.getDB().transaction((txn) async { WKDBHelper.shared.getDB().transaction((txn) async {
if (addList.isNotEmpty) { if (addList.isNotEmpty) {
for (Map<String, dynamic> value in addList) { for (Map<String, dynamic> value in addList) {
txn.insert(WKDBConst.tableReminders, value); txn.insert(WKDBConst.tableReminders, value,
conflictAlgorithm: ConflictAlgorithm.replace);
} }
} }
if (updateList.isNotEmpty) { if (updateList.isNotEmpty) {
@ -119,16 +121,17 @@ class ReminderDB {
StringBuffer sb = StringBuffer(); StringBuffer sb = StringBuffer();
for (int i = 0, size = channelIds.length; i < size; i++) { for (int i = 0, size = channelIds.length; i < size; i++) {
if (i != 0) { if (i != 0) {
sb.write("'"); sb.write(",");
} }
sb.write("'");
sb.write(channelIds[i]); sb.write(channelIds[i]);
sb.write("'"); sb.write("'");
} }
String sql =
"select * from ${WKDBConst.tableReminders} where channel_id in (${sb.toString()})";
List<WKReminder> list = []; List<WKReminder> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableReminders,
where: "channel_id in (?)",
whereArgs: [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeReminder(data)); list.add(WKDBConst.serializeReminder(data));
@ -145,11 +148,11 @@ class ReminderDB {
} }
sb.write(ids[i]); sb.write(ids[i]);
} }
String sql =
"select * from ${WKDBConst.tableReminders} where reminder_id in (${sb.toString()})";
List<WKReminder> list = []; List<WKReminder> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
await WKDBHelper.shared.getDB().rawQuery(sql); WKDBConst.tableReminders,
where: "reminder_id in (?)",
whereArgs: [sb.toString()]);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeReminder(data)); list.add(WKDBConst.serializeReminder(data));

View File

@ -16,9 +16,8 @@ class WKChannelManager {
fetchChannelInfo(String channelID, int channelType) { fetchChannelInfo(String channelID, int channelType) {
if (_getChannelInfoBack != null) { if (_getChannelInfoBack != null) {
_getChannelInfoBack!(channelID, channelType, (liMChannel) { _getChannelInfoBack!(channelID, channelType, (wkChannel) {
addOrUpdateChannel(liMChannel); addOrUpdateChannel(wkChannel);
ChannelDB.shared.saveOrUpdate(liMChannel);
}); });
} }
} }

View File

@ -250,6 +250,7 @@ class WKConnectionManager {
_decodePacket(Uint8List data) { _decodePacket(Uint8List data) {
var packet = WKIM.shared.options.proto.decode(data); var packet = WKIM.shared.options.proto.decode(data);
Logs.debug('解码出包->$packet'); Logs.debug('解码出包->$packet');
Logs.debug('解码出包类型->${packet.header.packetType}');
if (packet.header.packetType == PacketType.connack) { if (packet.header.packetType == PacketType.connack) {
var connackPacket = packet as ConnackPacket; var connackPacket = packet as ConnackPacket;
if (connackPacket.reasonCode == 1) { if (connackPacket.reasonCode == 1) {
@ -293,6 +294,7 @@ class WKConnectionManager {
} }
_closeAll() { _closeAll() {
_isLogout = true;
WKIM.shared.options.uid = ''; WKIM.shared.options.uid = '';
WKIM.shared.options.token = ''; WKIM.shared.options.token = '';
WKIM.shared.messageManager.updateSendingMsgFail(); WKIM.shared.messageManager.updateSendingMsgFail();

View File

@ -131,6 +131,9 @@ class RecvPacket extends Packet {
class DisconnectPacket extends Packet { class DisconnectPacket extends Packet {
int reasonCode = 0; int reasonCode = 0;
String reason = ""; String reason = "";
DisconnectPacket() {
header.packetType = PacketType.disconnect;
}
} }
class PingPacket extends Packet { class PingPacket extends Packet {

View File

@ -171,7 +171,6 @@ Uint8List encodeSend(SendPacket packet) {
Uint8List encodeRecvAck(RecvAckPacket packet) { Uint8List encodeRecvAck(RecvAckPacket packet) {
WriteData write = WriteData(); WriteData write = WriteData();
print("发送ack ${packet.messageID}");
write.writeUint64(packet.messageID); write.writeUint64(packet.messageID);
write.writeUint32(packet.messageSeq); write.writeUint32(packet.messageSeq);
return write.toUint8List(); return write.toUint8List();

View File

@ -15,7 +15,7 @@ description: wukong IM flutter sdk
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.1.9 version: 1.2.1
homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK
environment: environment: