mirror of
https://github.com/WuKongIM/WuKongIMFlutterSDK
synced 2025-05-27 13:22:21 +00:00
203 lines
6.3 KiB
Dart
203 lines
6.3 KiB
Dart
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<int> getMaxVersion() async {
|
|
String sql =
|
|
"select * from ${WKDBConst.tableReminders} order by version desc limit 1";
|
|
int version = 0;
|
|
|
|
List<Map<String, Object?>> 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<List<WKReminder>> 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<WKReminder> list = [];
|
|
|
|
List<Map<String, Object?>> results =
|
|
await WKDBHelper.shared.getDB().rawQuery(sql);
|
|
if (results.isNotEmpty) {
|
|
for (Map<String, Object?> data in results) {
|
|
list.add(WKDBConst.serializeReminder(data));
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
Future<List<WKReminder>> saveReminders(List<WKReminder> list) async {
|
|
List<int> ids = [];
|
|
List<String> 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<Map<String, dynamic>> addList = [];
|
|
List<Map<String, dynamic>> updateList = [];
|
|
List<WKReminder> 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<String, dynamic> value in addList) {
|
|
txn.insert(WKDBConst.tableReminders, value);
|
|
}
|
|
}
|
|
if (updateList.isNotEmpty) {
|
|
for (Map<String, dynamic> value in updateList) {
|
|
txn.update(WKDBConst.tableReminders, value,
|
|
where: "reminder_id=${value['reminder_id']}");
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
List<WKReminder> reminderList = await queryWithChannelIds(channelIds);
|
|
HashMap<String, List<WKReminder>?> maps = listToMap(reminderList);
|
|
List<WKUIConversationMsg> uiMsgList = [];
|
|
List<WKConversationMsg> 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<List<WKReminder>> queryWithChannelIds(List<String> 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<WKReminder> list = [];
|
|
List<Map<String, Object?>> results =
|
|
await WKDBHelper.shared.getDB().rawQuery(sql);
|
|
if (results.isNotEmpty) {
|
|
for (Map<String, Object?> data in results) {
|
|
list.add(WKDBConst.serializeReminder(data));
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
Future<List<WKReminder>> queryWithIds(List<int> 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<WKReminder> list = [];
|
|
List<Map<String, Object?>> results =
|
|
await WKDBHelper.shared.getDB().rawQuery(sql);
|
|
if (results.isNotEmpty) {
|
|
for (Map<String, Object?> data in results) {
|
|
list.add(WKDBConst.serializeReminder(data));
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
HashMap<String, List<WKReminder>?> listToMap(List<WKReminder> list) {
|
|
HashMap<String, List<WKReminder>?> map = HashMap();
|
|
if (list.isEmpty) {
|
|
return map;
|
|
}
|
|
for (WKReminder reminder in list) {
|
|
String key = "${reminder.channelID}_${reminder.channelType}";
|
|
List<WKReminder>? tempList = [];
|
|
if (map.containsKey(key)) {
|
|
tempList = map[key];
|
|
}
|
|
tempList ??= [];
|
|
tempList.add(reminder);
|
|
map[key] = tempList;
|
|
}
|
|
return map;
|
|
}
|
|
|
|
dynamic getMap(WKReminder reminder) {
|
|
var map = <String, Object>{};
|
|
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;
|
|
}
|
|
}
|