From 3a9b529811f7890e1398e66ff67dddc2919585c9 Mon Sep 17 00:00:00 2001 From: thinkerr24 Date: Thu, 19 Jun 2025 08:20:10 +0800 Subject: [PATCH] add sqllite utils --- lib/config/database_helper.dart | 56 +++++++++++++++++++++++++++++++++ lib/models/message_model.dart | 13 ++++++++ lib/screens/chat_screen.dart | 32 ++++++++++++++++++- pubspec.yaml | 2 ++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 lib/config/database_helper.dart create mode 100644 lib/models/message_model.dart diff --git a/lib/config/database_helper.dart b/lib/config/database_helper.dart new file mode 100644 index 0000000..3aa4799 --- /dev/null +++ b/lib/config/database_helper.dart @@ -0,0 +1,56 @@ +import 'dart:io'; +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; + +class DatabaseHelper { + static final DatabaseHelper _instance = DatabaseHelper._internal(); + factory DatabaseHelper() => _instance; + static Database? _database; + + DatabaseHelper._internal(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + Directory documentsDirectory = await getApplicationDocumentsDirectory(); + String path = join(documentsDirectory.path, 'chat.db'); + return await openDatabase( + path, + version: 1, + onCreate: _onCreate, + ); + } + + Future _onCreate(Database db, int version) async { + await db.execute(''' + CREATE TABLE messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + role TEXT NOT NULL, + message TEXT NOT NULL, + timestamp INTEGER DEFAULT (strftime('%s', 'now')) + '''); + } + + // 插入一条消息 + Future insertMessage(Map message) async { + Database db = await database; + return await db.insert('messages', message); + } + + // 获取所有消息(按时间排序) + Future>> getMessages() async { + Database db = await database; + return await db.query('messages', orderBy: 'timestamp ASC'); + } + + // 删除所有消息 + Future clearMessages() async { + Database db = await database; + return await db.delete('messages'); + } +} \ No newline at end of file diff --git a/lib/models/message_model.dart b/lib/models/message_model.dart new file mode 100644 index 0000000..ac86645 --- /dev/null +++ b/lib/models/message_model.dart @@ -0,0 +1,13 @@ +class Message { + final String role; // 'user' 或 'assistant' + final String message; + + Message({required this.role, required this.message}); + + Map toMap() { + return { + 'role': role, + 'message': message, + }; + } +} \ No newline at end of file diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index f31e589..d5bb6ef 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -4,7 +4,9 @@ import '../widgets/chat_bubble.dart'; import '../widgets/chat_input.dart'; import '../widgets/gradient_background.dart'; import '../models/chat_message.dart'; -import 'dart:convert'; +//import 'dart:convert'; +import '../config/database_helper.dart'; +import '../models/message_model.dart'; class ChatScreen extends StatefulWidget { const ChatScreen({super.key}); @@ -18,6 +20,9 @@ class _ChatScreenState extends State { int? _currentStreamingMessageIndex; int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量 + final DatabaseHelper _dbHelper = DatabaseHelper(); + List _messagesDB = []; + void _handleSendMessage(String text) { if (text.trim().isEmpty) return; setState(() { @@ -41,6 +46,12 @@ class _ChatScreenState extends State { )); _lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数 _currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡 + + _addMessage(Message( + role: 'user', + message: text, + )); + }); } @@ -76,6 +87,11 @@ class _ChatScreenState extends State { } } + _addMessage(Message( + role: 'assistant', + message: text, + )); + // 如果完成了,重置索引 if (isComplete) { _currentStreamingMessageIndex = null; @@ -83,6 +99,20 @@ class _ChatScreenState extends State { }); } + Future _loadMessages() async { + List> records = await _dbHelper.getMessages(); + setState(() { + _messagesDB = records.map((record) => Message( + role: record['role'], + message: record['message'], + )).toList(); + }); + } + + Future _addMessage(Message message) async { + await _dbHelper.insertMessage(message.toMap()); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/pubspec.yaml b/pubspec.yaml index 5d66600..516af79 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,6 +38,8 @@ dependencies: record: ^6.0.0 http: ^1.2.1 path_provider: ^2.1.2 + sqflite: ^2.4.2 + path: ^1.9.1 dev_dependencies: flutter_test: