import 'dart:collection'; import 'dart:convert'; import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/conversation.dart'; import 'package:wukongimfluttersdk/db/wk_db_helper.dart'; import 'package:wukongimfluttersdk/wkim.dart'; import '../entity/conversation.dart'; import '../entity/reminder.dart'; class ReminderDB { ReminderDB._privateConstructor(); static final ReminderDB _instance = ReminderDB._privateConstructor(); static ReminderDB get shared => _instance; Future getMaxVersion() async { String sql = "select * from ${WKDBConst.tableReminders} order by version desc limit 1"; int version = 0; List> list = await WKDBHelper.shared.getDB().rawQuery(sql); if (list.isNotEmpty) { dynamic data = list[0]; if (data != null) { version = WKDBConst.readInt(data, 'version'); } } return version; } Future> queryWithChannel( 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 list = []; List> results = await WKDBHelper.shared.getDB().rawQuery(sql); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); } } return list; } Future> saveReminders(List list) async { List ids = []; List channelIds = []; for (int i = 0, size = list.length; i < size; i++) { bool isAdd = true; for (String channelId in channelIds) { if (list[i].channelID == list[i].channelID && channelId == list[i].channelID) { isAdd = false; break; } } if (isAdd) { channelIds.add(list[i].channelID); } ids.add(list[i].reminderID); } List> addList = []; List> updateList = []; List allList = await queryWithIds(ids); for (int i = 0, size = list.length; i < size; i++) { bool isAdd = true; for (WKReminder reminder in allList) { if (reminder.reminderID == list[i].reminderID) { updateList.add(getMap(reminder)); isAdd = false; break; } } if (isAdd) { addList.add(getMap(list[i])); } } if (addList.isNotEmpty || updateList.isNotEmpty) { WKDBHelper.shared.getDB().transaction((txn) async { if (addList.isNotEmpty) { for (Map value in addList) { txn.insert(WKDBConst.tableReminders, value); } } if (updateList.isNotEmpty) { for (Map value in updateList) { txn.update(WKDBConst.tableReminders, value, where: "reminder_id=${value['reminder_id']}"); } } }); } List reminderList = await queryWithChannelIds(channelIds); HashMap?> maps = listToMap(reminderList); List uiMsgList = []; List msgs = await ConversationDB.shared.queryWithChannelIds(channelIds); for (int i = 0; i < msgs.length; i++) { uiMsgList.add(ConversationDB.shared.getUIMsg(msgs[i])); } for (int i = 0, size = uiMsgList.length; i < size; i++) { String key = "${uiMsgList[i].channelID}_${uiMsgList[i].channelType}"; if (maps.containsKey(key) && maps[key] != null) { uiMsgList[i].setReminderList(maps[key]!); } WKIM.shared.conversationManager .setRefreshMsg(uiMsgList[i], i == list.length - 1); } return reminderList; } Future> queryWithChannelIds(List channelIds) async { StringBuffer sb = StringBuffer(); for (int i = 0, size = channelIds.length; i < size; i++) { if (i != 0) { sb.write("'"); } sb.write(channelIds[i]); sb.write("'"); } String sql = "select * from ${WKDBConst.tableReminders} where channel_id in (${sb.toString()})"; List list = []; List> results = await WKDBHelper.shared.getDB().rawQuery(sql); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); } } return list; } Future> queryWithIds(List ids) async { StringBuffer sb = StringBuffer(); for (int i = 0, size = ids.length; i < size; i++) { if (sb.length != 0) { sb.write(','); } sb.write(ids[i]); } String sql = "select * from ${WKDBConst.tableReminders} where reminder_id in (${sb.toString()})"; List list = []; List> results = await WKDBHelper.shared.getDB().rawQuery(sql); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); } } return list; } HashMap?> listToMap(List list) { HashMap?> map = HashMap(); if (list.isEmpty) { return map; } for (WKReminder reminder in list) { String key = "${reminder.channelID}_${reminder.channelType}"; List? tempList = []; if (map.containsKey(key)) { tempList = map[key]; } tempList ??= []; tempList.add(reminder); map[key] = tempList; } return map; } dynamic getMap(WKReminder reminder) { var map = {}; map['channel_id'] = reminder.channelID; map['channel_type'] = reminder.channelType; map['reminder_id'] = reminder.reminderID; map['message_id'] = reminder.messageID; map['message_seq'] = reminder.messageSeq; map['uid'] = reminder.uid; map['type'] = reminder.type; map['is_locate'] = reminder.isLocate; map['text'] = reminder.text; map['version'] = reminder.version; map['done'] = reminder.done; map['needUpload'] = reminder.needUpload; map['publisher'] = reminder.publisher; if (reminder.data != null) { map['data'] = jsonEncode(reminder.data); } else { map['data'] = ''; } return map; } }