From 2a78af4885dc380526c7134d6631ef07956a617f Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Fri, 14 Oct 2022 14:32:50 +0800 Subject: [PATCH] Fix Bug - Data base concurrency cause constraint failed when updating userinfo --- lib/chat/cubit/chat_cubit.dart | 40 ++++++++++++++++++- lib/chat/cubit/chat_state.dart | 19 ++++++++- .../view/in_message_box/in_message_box.dart | 6 +++ .../view/out_message_box/out_message_box.dart | 6 +++ .../cubit/initialization_cubit.dart | 3 +- .../local_service_repository.dart | 38 +++++++++--------- 6 files changed, 91 insertions(+), 21 deletions(-) create mode 100644 lib/chat/view/in_message_box/in_message_box.dart create mode 100644 lib/chat/view/out_message_box/out_message_box.dart diff --git a/lib/chat/cubit/chat_cubit.dart b/lib/chat/cubit/chat_cubit.dart index 24cb314..ce145ef 100644 --- a/lib/chat/cubit/chat_cubit.dart +++ b/lib/chat/cubit/chat_cubit.dart @@ -1,6 +1,44 @@ /* * @Author : Linloir * @Date : 2022-10-13 14:03:56 - * @LastEditTime : 2022-10-13 14:03:56 + * @LastEditTime : 2022-10-14 13:47:33 * @Description : */ + +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:tcp_client/chat/cubit/chat_state.dart'; +import 'package:tcp_client/repositories/common_models/message.dart'; +import 'package:tcp_client/repositories/local_service_repository/local_service_repository.dart'; +import 'package:tcp_client/repositories/tcp_repository/models/tcp_response.dart'; +import 'package:tcp_client/repositories/tcp_repository/tcp_repository.dart'; + +class ChatCubit extends Cubit { + ChatCubit({ + required this.localServiceRepository, + required this.tcpRepository + }): super(ChatState.empty()) { + subscription = tcpRepository.responseStreamBroadcast.listen(_onResponse); + } + + final LocalServiceRepository localServiceRepository; + final TCPRepository tcpRepository; + late final StreamSubscription subscription; + + void addMessage(Message message) { + //Store locally + //Send to server + //Emit new state + } + + void _onResponse(TCPResponse response) { + + } + + @override + Future close() { + subscription.cancel(); + return super.close(); + } +} diff --git a/lib/chat/cubit/chat_state.dart b/lib/chat/cubit/chat_state.dart index 4f1056b..201c7fb 100644 --- a/lib/chat/cubit/chat_state.dart +++ b/lib/chat/cubit/chat_state.dart @@ -1,6 +1,23 @@ /* * @Author : Linloir * @Date : 2022-10-13 14:03:52 - * @LastEditTime : 2022-10-13 14:03:52 + * @LastEditTime : 2022-10-14 13:42:46 * @Description : */ + +import 'package:equatable/equatable.dart'; +import 'package:tcp_client/repositories/common_models/message.dart'; + +enum ChatStatus { fetching, partial, full } + +class ChatState extends Equatable { + final ChatStatus status; + final List chatHistory; + + const ChatState({required this.chatHistory, required this.status}); + + static ChatState empty() => const ChatState(chatHistory: [], status: ChatStatus.fetching); + + @override + List get props => [chatHistory]; +} diff --git a/lib/chat/view/in_message_box/in_message_box.dart b/lib/chat/view/in_message_box/in_message_box.dart new file mode 100644 index 0000000..759f99d --- /dev/null +++ b/lib/chat/view/in_message_box/in_message_box.dart @@ -0,0 +1,6 @@ +/* + * @Author : Linloir + * @Date : 2022-10-14 13:49:47 + * @LastEditTime : 2022-10-14 13:49:47 + * @Description : + */ diff --git a/lib/chat/view/out_message_box/out_message_box.dart b/lib/chat/view/out_message_box/out_message_box.dart new file mode 100644 index 0000000..992e513 --- /dev/null +++ b/lib/chat/view/out_message_box/out_message_box.dart @@ -0,0 +1,6 @@ +/* + * @Author : Linloir + * @Date : 2022-10-14 13:49:28 + * @LastEditTime : 2022-10-14 13:49:28 + * @Description : + */ diff --git a/lib/initialization/cubit/initialization_cubit.dart b/lib/initialization/cubit/initialization_cubit.dart index e78733c..76d297d 100644 --- a/lib/initialization/cubit/initialization_cubit.dart +++ b/lib/initialization/cubit/initialization_cubit.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-12 09:56:04 - * @LastEditTime : 2022-10-12 17:54:35 + * @LastEditTime : 2022-10-14 14:24:11 * @Description : */ @@ -22,6 +22,7 @@ class InitializationCubit extends Cubit { TCPRepository? tcpRepository; LocalServiceRepository? localServiceRepository; Future(() async { + print('${(await getApplicationDocumentsDirectory()).path}/.data/database.db'); localServiceRepository = await LocalServiceRepository.create(databaseFilePath: '${(await getApplicationDocumentsDirectory()).path}/.data/database.db'); }).then((_) { emit(state.copyWith( diff --git a/lib/repositories/local_service_repository/local_service_repository.dart b/lib/repositories/local_service_repository/local_service_repository.dart index 783b869..be5d442 100644 --- a/lib/repositories/local_service_repository/local_service_repository.dart +++ b/lib/repositories/local_service_repository/local_service_repository.dart @@ -1,7 +1,7 @@ /* * @Author : Linloir * @Date : 2022-10-11 10:56:02 - * @LastEditTime : 2022-10-12 15:35:30 + * @LastEditTime : 2022-10-14 14:30:11 * @Description : Local Service Repository */ @@ -231,27 +231,29 @@ class LocalServiceRepository { Future storeUserInfo({ required UserInfo userInfo }) async { - //check if exist - var queryResult = await _database.query( - 'users', - where: 'userid = ?', - whereArgs: [userInfo.userID] - ); - if(queryResult.isEmpty) { - _database.insert( + await _database.transaction((txn) async { + //check if exist + var queryResult = await txn.query( 'users', - userInfo.jsonObject - ); - } - else { - _database.update( - 'users', - userInfo.jsonObject, where: 'userid = ?', whereArgs: [userInfo.userID] ); - } - _userInfoChangeStreamController.add(userInfo); + if(queryResult.isEmpty) { + txn.insert( + 'users', + userInfo.jsonObject + ); + } + else { + txn.update( + 'users', + userInfo.jsonObject, + where: 'userid = ?', + whereArgs: [userInfo.userID] + ); + } + _userInfoChangeStreamController.add(userInfo); + }); } Future fetchUserInfoViaID({required int userid}) async {