import 'dart:collection'; import 'dart:convert'; import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/entity/channel.dart'; import 'wk_db_helper.dart'; class ChannelDB { ChannelDB._privateConstructor(); static final ChannelDB _instance = ChannelDB._privateConstructor(); static ChannelDB get shared => _instance; Future query(String channelID, int channelType) async { String sql = "select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType"; WKChannel? channel; List> list = await WKDBHelper.shared.getDB().rawQuery(sql); if (list.isNotEmpty) { channel = WKDBConst.serializeChannel(list[0]); } return channel; } insertOrUpdateList(List list) async { List> addList = []; List> updateList = []; for (WKChannel channel in list) { bool bl = await isExist(channel.channelID, channel.channelType); if (bl) { updateList.add(getMap(channel)); } else { addList.add(getMap(channel)); } } if (addList.isNotEmpty || updateList.isNotEmpty) { WKDBHelper.shared.getDB().transaction((txn) async { if (addList.isNotEmpty) { for (Map value in addList) { txn.insert(WKDBConst.tableChannel, value); } } if (updateList.isNotEmpty) { for (Map value in updateList) { txn.update(WKDBConst.tableChannel, value, where: "channel_id='${value['channel_id']}' and channel_type=${value['channel_type']}"); } } }); } } saveOrUpdate(WKChannel channel) async { bool bl = await isExist(channel.channelID, channel.channelType); if (!bl) { insert(channel); } else { update(channel); } } insert(WKChannel channel) { WKDBHelper.shared.getDB().insert(WKDBConst.tableChannel, getMap(channel)); } update(WKChannel channel) { WKDBHelper.shared.getDB().update(WKDBConst.tableChannel, getMap(channel), where: "channel_id='${channel.channelID}' and channel_type=${channel.channelType}"); } Future isExist(String channelID, int channelType) async { bool isExit = false; String sql = "select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType"; List> list = await WKDBHelper.shared.getDB().rawQuery(sql); if (list.isNotEmpty) { dynamic data = list[0]; if (data != null) { String channelID = WKDBConst.readString(data, 'channel_id'); if (channelID != '' && channelID.isNotEmpty) { isExit = true; } } } return isExit; } Future> queryWithChannelIdsAndChannelType( List channelIDs, int channelType) async { if (channelIDs.isEmpty) { return []; } StringBuffer sb = StringBuffer(); for (int i = 0, size = channelIDs.length; i < size; i++) { if (i != 0) { sb.write(","); } sb.write("'"); sb.write(channelIDs[i]); sb.write("'"); } String channelIds = sb.toString(); String sql = "select * from ${WKDBConst.tableChannel} where channel_id in ($channelIds) and channel_type=$channelType"; List list = []; List> results = await WKDBHelper.shared.getDB().rawQuery(sql); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeChannel(data)); } } return list; } dynamic getMap(WKChannel channel) { var data = HashMap(); data['channel_id'] = channel.channelID; data['channel_type'] = channel.channelType; data['channel_name'] = channel.channelName; data['channel_remark'] = channel.channelRemark; data['avatar'] = channel.avatar; data['top'] = channel.top; data['save'] = channel.save; data['mute'] = channel.mute; data['forbidden'] = channel.forbidden; data['invite'] = channel.invite; data['status'] = channel.status; data['is_deleted'] = channel.isDeleted; data['follow'] = channel.follow; data['version'] = channel.version; data['show_nick'] = channel.showNick; data['created_at'] = channel.createdAt; data['updated_at'] = channel.updatedAt; data['online'] = channel.online; data['last_offline'] = channel.lastOffline; data['receipt'] = channel.receipt; data['robot'] = channel.robot; data['category'] = channel.category; data['username'] = channel.username; data['avatar_cache_key'] = channel.avatarCacheKey; data['device_flag'] = channel.deviceFlag; data['parent_channel_id'] = channel.parentChannelID; data['parent_channel_type'] = channel.parentChannelType; if (channel.remoteExtraMap != null) { data['remote_extra'] = jsonEncode(channel.remoteExtraMap); } if (channel.localExtra != null) { data['extra'] = jsonEncode(channel.localExtra); } return data; } }